Я пытаюсь передать обе строки даты new Date(t)
.
Я ожидаю, что обе строки представляют одно и то же время, в конце концов, если я опущу время, разве это не будет полночь того дня?
Но пока,
new Date("2016-02-16 00:00")
возвращает 16 февраля 2016 г., полночь по местному времени, как и ожидалось,
new Date("2016-02-16")
возвращает 2016-02-16, полночь по Гринвичу, что неверно, или, по крайней мере, не то, что я ожидал, учитывая то, что анализирует другая строка.
Я бы понял это, если бы у них обоих было одинаковое поведение, будь то возвращение времени как местного времени или как UTC, но кажется очень непоследовательным, почему они возвращают разные вещи, подобные этому.
В качестве обходного пути всякий раз, когда я сталкиваюсь с датой, у которой нет соответствующей отметки времени, я могу добавить «00:00», чтобы добиться согласованного поведения, но это кажется довольно хрупким.
Я получаю это значение из элемента INPUT типа «datetime-local», поэтому мне кажется особенно непоследовательным, что мне приходится работать с значением, возвращаемым элементом страницы.
Я что-то делаю не так, или я должен делать что-то по-другому?
источник
2016-02-16 00:00
- это совсем не похоже на действительное время. ecma-international.org/ecma-262/6.0/… , но даже после того, как вы поместилиT
туда, он действительно ведет себя по-другомуОтветы:
Вот что говорит спецификация ES5.1 :
В нем также говорится:
Поскольку формат требует
T
разделителя между датой и временем, допустимое время указывается в формате UTC:... в то время как в node.js недопустимое время (без разделителя T), похоже, относится к конкретному местному времени реализации:
Обратите внимание, что ES6 изменил это, в той же части документации он меняется на:
Радость ломать перемены .
редактировать
Согласно TC39 , спецификация должна интерпретироваться как строки даты и времени без часового пояса (например, «2016-02-16T00: 00: 00») обрабатываются как локальные (в соответствии с ISO 8601), но строки только даты (например, «2016-02-16») как UTC (что несовместимо с ISO 8601).
источник
Согласно спецификации :
И форматы строки даты и времени принимают
2016-02-16
как действительную датуТаким образом
2016-02-16
переводится на2016-02-16T00:00:00.000Z
.Другая дата
2016-02-16 00:00
не соответствует формату, и поэтому ее анализ зависит от реализации. По-видимому, такие даты рассматриваются как имеющие местный часовой пояс, и ваша примерная дата будет возвращать разные значения в зависимости от часового пояса:Резюме:
NaN
вместо попытки синтаксического анализа несоответствующих дат. Просто проверьте свой код в Internet Explorer 11;)источник
Возможно, вы столкнулись с различиями между реализациями ES5 и ES6 и ожидаемым результатом. Per Date.parse в MDN, «особенно в различных реализациях ECMAScript, где строки вроде« 2015-10-12 12:00:00 »могут быть проанализированы как NaN, UTC или местный часовой пояс».
Дополнительное тестирование в Firefox 44 и IE 11 показало, что оба они возвращают объект даты, для
new Date("2016-02-16 00:00")
которого объект возвращает NaN при попытке получить значение компонента даты, а значение toString которого равно «Invalid Date» (не «NaN»). Следовательно, добавление «00:00 для согласованного поведения» может легко нарушить работу разных браузеров.Как отмечалось в других ответах,
new Date("2016-02-16")
по умолчанию используется смещение часового пояса, равное нулю, что создает полночь по Гринвичу вместо местного.источник
Согласно
DateParser::Parse()
исходным кодам V8 для Chrome.источник
Он добавляет смещение часового пояса к
00:00
new Date("2016-02-16")
выходыTue Feb 16 2016 05:30:00 GMT+0530 (India Standard Time)
Мой часовой пояс IST со значением смещения (в минутах)
+330
, поэтому он добавил 330 минут к 00:00.Согласно ecma-262, раздел 20.3.3.2 Date.parse (строка)
Когда вы явно устанавливаете единицы времени,
new Date("2016-02-16 00:00")
он будет использовать их какhours
иminutes
,В противном случае, как указано здесь в 2 0.3.1.16
источник
section 20.3.3.2
The String may be interpreted as a local time, a UTC time, or a time in some other time zone, depending on the contents of the String.
где оно утверждает, что оно должно быть таким же?