Подтвердить что ты не робот

Почему ГГГГ-ММ-ДД!= ГГГГ/ММ/ДД

В Chrome у нас появляется какая-то странность

> new Date("2014-01-01") - new Date("2014/01/01")
< 3600000

И это потому, что

new Date("2014-01-01")
Wed Jan 01 2014 01:00:00 GMT+0100 (CET)

while

new Date("2014/01/01")
Wed Jan 01 2014 00:00:00 GMT+0100 (CET)

Почему "-", кажется, добавляет 1 час к времени?

4b9b3361

Ответ 1

Я считаю, что разница вызвана Date.parse добавлением UTC к одной строке, но не к другой, а именно: / не является юридическим разделителем в Date.parse(), что означает, что UTC не добавляется к когда он разбирается. Поскольку ' является законным разделителем, он анализируется, а затем возвращается время UTC.

Date.parse используется методом new Date(), и его реализация специфична для браузера, я удивлен, что такая вещь не возникает чаще.

В спецификации Date.parse указано:

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

Итак, я предлагаю либо добавить в часовой пояс вручную, прежде чем разбираться, либо отбрасывать время, возвращенное new Date(), однако это может привести к проблемам около полуночи и т.д. Самым безопасным будет увидеть, можете ли вы получить даты в более конкретном формате от обеих систем, с информацией о часовом поясе.

Ответ 2

Цитата из исходного кода V8.

Комментарии этой функции

bool DateParser::Parse(Vector<Char> str,
                       FixedArray* out,
                       UnicodeCache* unicode_cache)

Примите ES5 ISO 8601 даты-даты или устаревшие даты, совместимые с Safari.

ES5 ISO 8601:

[('-'|'+')yy]yyyy[-MM[-DD]][THH:mm[:ss[.sss]][Z|(+|-)hh:mm]]

Строка, соответствующая обоим форматам (например, 1970-01-01), будет     анализируется как строка времени даты ES5, что означает, что она будет использоваться по умолчанию     в часовой пояс UTC. Это неизбежно, если следовать спецификации ES5.

Тире (-) - правильная нотация для Date.

Ответ 3

Это из-за глобализации. Символ (-) не является английской нотой (GMT). Javascript анализирует обозначения. Попробуйте настроить культуру, а затем используйте тире.