новий 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).
натхненний

1
Кут Нітпікера: «Час UTC у форматі JSON» - формат JSON? Саме поширена скарга на JSON полягає в тому, що він взагалі не визначає жодного формату дати.
Альваро Гонсалес

Відповіді:


66

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


2
Дякую. Це працює. Але є припис, що в журналі буде згодом !!! Будь-яка ідея, будь ласка?
Дебора

1
велике спасибі, я два дні сиджу з цим питанням, але ця публікація вирішила все.
Піял Джордж

30

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

Рядок може інтерпретуватися як локальний час, час UTC або час у якомусь іншому часовому поясі, залежно від вмісту рядка. Функція спочатку намагається проаналізувати формат String згідно з правилами, викличеними у форматі String Stream Date ( 15.9.1.15 ). Якщо Рядок не відповідає цьому формату, функція може повернутися до будь-яких евристичних характеристик реалізації або конкретних форматів дати.

Щоб Dateконструктор не (можливо) використовував локальний часовий пояс, використовуйте рядок дати з інформацією про часовий пояс, наприклад "2013-02-27T17:00:00Z". Однак важко знайти формат, який би був надійно проаналізований кожним браузером - формат ISO не розпізнається IE <8 (див. JavaScript: Які браузери підтримують розбір ISO-8601 String Date with 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: Дякую за подальше вивчення цього питання. Однак, незалежно від того, що зазначено у специфікації, [старі] браузери все ще роблять це по-різному :-)
Bergi

2
Як не дивно за допомогою Date.Parse vs. new Date виправлено проблему, у якій Chrome перетворював дату в локальний часовий пояс, а не трактував її як локальний часовий пояс.
KingOfHypocrites

1
@ KingOfHypocrites - це трохи дивно, оскільки виклик конструктора Date за допомогою рядка повинен бути таким же, як і використання Date.parse .
RobG

4

Я знайшов тут одне. Здається, що в нативної консолі інспектора Firefox може виникнути помилка: Якщо я запускаю "new Date ()" у вродженому Inspector, вона показує дату з неправильним часовим поясом, локальною локальною стороною GMT, але запускає ту саму команду в консолі розширення Firebug, дата показано, що використовується мій правильний часовий пояс (GMT-3: 00).


-2

Спробуйте скористатися moment.js. Це дуже добре і аналогічно з усіма браузерами. поставляється з багатьма параметрами форматування. використовувати момент ("дата"). формат ("") замість Нової дати ("дата")


-2

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

Останній результат консолі - це те, що мені було потрібно:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.