new Date () работает по-разному в Chrome и Firefox

94

Я хочу преобразовать строку даты в Datejavascript, используйте этот код:

var date = new Date('2013-02-27T17:00:00');
alert(date);

'2013-02-27T17:00:00' время в формате UTC в объекте JSON с сервера.

Но результат приведенного выше кода отличается в Firefox и Chrome:

Firefox возвращает:

Wed Feb 27 2013 17:00:00 GMT+0700 (SE Asia Standard Time)

Chrome возвращает:

Thu Feb 28 2013 00:00:00 GMT+0700 (SE Asia Standard Time) 

Это другой 1 день, правильный результат, которого я ожидал, - это результат от Chrome.

Демо-код: http://jsfiddle.net/xHtqa/2/

Как я могу исправить эту проблему, чтобы получить одинаковый результат в обоих случаях?

куонгле
источник
2
Это на том же компьютере?
Аарон Дигулла
4
@Sandeep, главное, что Chrome добавляет смещение часового пояса, а Firefox - нет
локаль по умолчанию
3
@CuongLe Вы видели этот вопрос: stackoverflow.com/questions/9062863/…
локаль по умолчанию
1
Это Date {Wed Feb 27 2013 17:00:00 GMT+0000 (GMT)}для меня в обоих (Linux).
marekful
1
Уголок Нитпикера: «Время UTC в формате JSON» - формат JSON? Точнее, распространенная жалоба на JSON заключается в том, что он вообще не определяет какой-либо формат даты.
Альваро Гонсалес,

Ответы:

67

Правильный формат для UTC будет 2013-02-27T17:00:00Z(Z для зулусского времени). Добавьте, Zесли нет, чтобы получить правильную строку даты и времени UTC.

Петр Абдулин
источник
2
Спасибо. Это работает. Но есть запись в журнале, что в будущем он будет устаревшим !!!. Любая идея, пожалуйста?
Дебора,
1
Большое спасибо, я сижу с этой проблемой два дня, но этот пост все решил.
Пиял Джордж
30

Да, к сожалению, алгоритмы разбора даты зависят от реализации. Из спецификацииDate.parse (которая используется new Date):

String может интерпретироваться как местное время, время в формате UTC или время в каком-либо другом часовом поясе, в зависимости от содержимого String. Функция сначала пытается проанализировать формат строки в соответствии с правилами, установленными в формате строки даты и времени ( 15.9.1.15 ). Если String не соответствует этому формату, функция может вернуться к любым эвристикам, зависящим от реализации, или форматам даты, зависящим от реализации.

Чтобы Dateконструктор (возможно) не использовал местный часовой пояс, используйте строку datetime с информацией о часовом поясе, например "2013-02-27T17:00:00Z". Однако трудно найти формат, который надежно анализируется каждым браузером - формат ISO не распознается IE <8 (см. JavaScript: какие браузеры поддерживают синтаксический анализ строки даты ISO-8601 с помощью Date.parse ). Лучше использовать временную метку unix, то есть миллисекунды с эпохи unix , или использовать регулярное выражение, чтобы разбить строку на части, а затем передать их Date.UTC.

Берги
источник
2
Но в спецификации (15.9.1.15) на самом деле говорится: «Значение смещения отсутствующего часового пояса равно« Z »» - поэтому оно НЕ должно зависеть от реализации
sinelaw
12
Хорошо, поправка. Похоже на ошибку в спецификации ES5.1 - намерение состояло в том, чтобы соответствовать ISO-8601, где отсутствие Z означает местное время (так что Chrome соответствует ES5.1, Firefox и IE соответствуют ISO-8601)
sinelaw
@sinelaw: Спасибо за дальнейшее исследование этого вопроса. Однако, независимо от того, что указано в спецификации, [старые] браузеры все еще делают это по-другому :-)
Берги
2
Как ни странно, использование Date.Parse vs. new Date устранило проблему, с которой я столкнулся, когда Chrome преобразовывал дату в местный часовой пояс вместо того, чтобы обрабатывать ее как уже находящуюся в местном часовом поясе.
KingOfHypocrites
1
@ KingOfHypocrites - это немного странно, поскольку вызов конструктора Date со строкой должен быть таким же, как и использование Date.parse .
RobG
4

Я нашел здесь одну вещь. Кажется, что в собственной консоли Firefox Inspector Console может быть ошибка: если я запускаю «new Date ()» в собственном Inspector, она показывает дату с неправильным часовым поясом, локалью GMT, но при выполнении той же команды в консоли Firebug Extension Console дата показан мой правильный часовой пояс (GMT-3: 00).

Серхио Абреу
источник
-2

Заметил, что FireFox не возвращает такой же результат, как Chrome. Похоже, формат, который вы используете в kendo.toString для даты, имеет значение.

Последний результат консоли - это то, что мне нужно:

введите описание изображения здесь

MJ Storm
источник
-3

Попробуйте использовать moment.js. Он работает очень хорошо и одинаково со всеми браузерами. поставляется с множеством вариантов форматирования. используйте момент ('date'). format ("") вместо New Date ('date')

MSIslam
источник