2010-08-17 4 views
44

У меня есть код, который пытается разобрать строку даты.Разница между датой (dateString) и новой датой (dateString)

Когда я alert(Date("2010-08-17 12:09:36")); Это правильно разбирает дату и все работает нормально, но я не могу назвать методы, связанные с Date, как getMonth().

Когда я пытаюсь:

var temp = new Date("2010-08-17 12:09:36"); 
alert(temp); 

Я получаю сообщение об ошибке "Неверная дата".

Любые идеи о том, как разобрать «2010-08-17 12:09:36» с новой датой()?

+0

делает предупреждение (Date ("2010-08-17 12:09:36") getMonth().); Работа? Я только что вставил var temp = new Date ("2010-08-17 12:09:36"); предупреждение (темп); на странице HTML, и все получилось отлично. – Zebi

+0

Используйте новую дату («2010-08-17T12: 09: 36») или новую дату («2010-08-17T12: 09: 36Z») для UTC. – Jack

ответ

56

Дата()

С этим вы вызываете функцию под названием Date(). Он не принимает никаких аргументов и возвращает строку, представляющую текущую дату и время.

новая Дата()

С этим вы создаете новый экземпляр Date.

Вы можете использовать только следующие конструкторы:

new Date() // current date and time 
new Date(milliseconds) //milliseconds since 1970/01/01 
new Date(dateString) 
new Date(year, month, day, hours, minutes, seconds, milliseconds) 

Таким образом, использование 2010-08-17 12:09:36 в качестве параметра конструктору не допускается.

См. w3schools.


EDIT: new Date(dateString) использует один из следующих форматов:

  • "13 октября 1975 11:13:00"
  • "13 октября 1975 11:13"
  • «Октябрь 13, 1975 "
+0

Нет ли другого способа обработки строки без создания собственного синтаксического анализа даты? – Yoshi9143

+0

Я не знаю, как это сделать, используя native js. Но вы можете использовать внешний парсер, например datejs (http://www.datejs.com/) – Topera

+2

Также в chrome и firefox новая Date() работает по-разному. Например, «yyyy-mm-dd hh: mm: ss» подходит для хрома, но не для firefox. – sunprophit

1

Правильные способы использования Дата: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date

Кроме того, следующий фрагмент кода показывает, как с помощью одного определения функции «Animal», это может быть) вызывается непосредственно и б) экземпляр путем его обработки как функция конструктора

function Animal(){ 
    this.abc = 1; 
    return 1234; 
} 

var x = new Animal(); 
var y = Animal(); 

console.log(x); //prints object containing property abc set to value 1 
console.log(y); // prints 1234 
3

разница заключается в том (если я помню из документации ECMA) является то, что Date("xx") не создает (в некотором смысле) новый объект даты (на самом деле это эквивалентно вызову (new Date("xx").toString()). В то время как new Date("xx") фактически создаст новый объект даты.

Дополнительная информация:

Посмотрите на 15.9.2 из http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf

0

Вы не получаете ошибку« неправильной даты ». Скорее, значение температуры - «Недействительная дата».

Является ли ваша строка даты действительным? Если вы используете Firefox, проверьте Date.parse

В Firefox Консоль JavaScript:

>>> Date.parse("2010-08-17 12:09:36"); 
NaN 
>>> Date.parse("Aug 9, 1995") 
807944400000 

Я бы попробовать другой формат строки даты.

Zebi, вы используете Internet Explorer?

+0

Должно быть «T» вместо пробела –

-2

Я недавно столкнулся с этим, и это был полезный пост. Я взял выше Topera шаг вперед, и это работает для меня как в хроме и светлячок:

var temp = new Date( Date("2010-08-17 12:09:36") ); 
alert(temp); 

внутренний вызов Date() возвращает строку, new Date() можно разобрать.

+0

. В чем используется два 'Date()' здесь, когда вы можете напрямую передать строку в конструкторе 'Date'. –

+1

@friesrf Ваш ответ совершенно неверен. Calling Date («2010-08-17 12:09:36») всегда будет возвращать значение вызова Date() без каких-либо параметров. Таким образом, с приведенным выше фрагментом кода вы никогда не получите обработанный объект даты с неверной строкой даты, а не новый объект даты, который эквивалентен сейчас. Код не вызывает ошибки, поскольку он не является функционально правильным. –

35

следующий формат работы в всех браузеров:

new Date("2010/08/17 12:09:36"); 

Таким образом, чтобы сделать yyyy-mm-dd hh:mm:ss отформатированную строку даты полностью совместим с браузерами вам придется заменить тире с косой черты:

var dateString = "2010-08-17 12:09:36"; 
new Date(dateString.replace(/-/g, "/")); 
+1

+1: работал для меня в IE5-11 и кажется самым простым решением при преобразовании даты строки стиля ISO-8601. – Roberto

+0

Нет, не делай этого. Гораздо лучше реализовать 2-строчную функцию для ручного анализа строки (или использовать библиотеку, но не обязательно). Спецификация языка отмечает, что браузеры должны анализировать ** любую ** строку, отличную от формата ISO 8601, и некоторые из них также не поддерживают это. – RobG

0

I имел ту же проблему, используя вызов API, который ответил в формате ISO 8601. Работа в Chrome этого работал: `

// date variable from an api all in ISO 8601 format yyyy-mm-dd hh:mm:ss 
    var date = oDate['events']['event'][0]['start_time']; 
    var eventDate = new Date(); 
    var outputDate = eventDate.toDateString(); 

`

, но это не работает с Firefox.

Над ответом помог мне отформатировать его правильно для светлячок:

// date variable from an api all in ISO 8601 format yyyy-mm-dd hh:mm:ss 
var date = oDate['events']['event'][0]['start_time']; 
var eventDate = new Date(date.replace(/-/g,"/"); 
var outputDate = eventDate.toDateString(); 
+0

Нет, не передавайте строки конструктору Date. При анализе даты ISO 8601 требуется 2 строки кода, сделайте это вместо этого. – RobG

+0

@RobG Хорошая обратная связь, спасибо! – sherkon18

3

Я знаю, что это старый, но гораздо проще решение просто использовать

var temp = new Date("2010-08-17T12:09:36"); 
+0

Это не удается в Safari. –

+2

Просто потому, что он терпит неудачу в Safari, это не значит, что это неправильное использование JavaScript. У меня нет Safari, чтобы проверить это, но я не знаю, почему что-то такое вездесущее будет работать в некоторых браузерах, а не в других. В любом случае это определенно не заслуживает пониженного голосования. –

+1

@ TheComposer - добро пожаловать в мир сценариев браузера. До ES5 была строка ** no **, которую браузеры должны были анализировать по стандарту. Некоторые из этих браузеров все еще используются.Это определенность, что в любой момент времени используются браузеры, которые не полностью поддерживают самый последний стандарт (или даже один-несколько лет), поэтому вы должны запрограммировать для самого низкого общего знаменателя, что поддерживают браузеры, а не строго в соответствии с текущей спецификацией. – RobG

1

Любые идеи о том, как parse "2010-08-17 12:09:36" с новой Date()?

До ES5 не было строкового формата, который должен был поддерживаться браузерами, хотя есть ряд, которые широко поддерживаются. Однако поддержка браузера ненадежна, несовместима, например. некоторые из них позволят использовать значения за пределами границ, а другие - не поддерживают некоторые форматы, а другие нет, и т. д.

ES5 представила поддержку некоторых форматов ISO 8601, однако OP не соответствует ISO 8601, а не всем браузерам в используйте его в любом случае.

Единственный надежный способ - использовать небольшую функцию синтаксического анализа. Следующий пример анализирует формат в OP, а также проверяет значения.

/* Parse date string in format yyyy-mm-dd hh:mm:ss 
 
** If string contains out of bounds values, an invalid date is returned 
 
** 
 
** @param {string} s - string to parse, e.g. "2010-08-17 12:09:36" 
 
**      treated as "local" date and time 
 
** @returns {Date} - Date instance created from parsed string 
 
*/ 
 
function parseDateString(s) { 
 
    var b = s.split(/\D/); 
 
    var d = new Date(b[0], --b[1], b[2], b[3], b[4], b[5]); 
 
    return d && d.getMonth() == b[1] && d.getHours() == b[3] && 
 
     d.getMinutes() == b[4]? d : new Date(NaN); 
 
} 
 
    
 
document.write(
 
    parseDateString('2010-08-17 12:09:36') + '<br>' + // Valid values 
 
    parseDateString('2010-08-45 12:09:36')    // Out of bounds date 
 
);

Смежные вопросы