new Date(Date.parse("Jul 8, 2005"));
Пятница 08 июля 2005 0:00:00 GMT 7:00 (PST)
new Date(Date.parse("2005-07-08"));
Четверг 07 июля 2005 17:00:00 GMT 7:00 (PST)
Почему второй синтаксический анализ является неправильным?
До выхода спецификации 5-го издания метод Date.parse
полностью зависел от реализации ( new Date (string)
эквивалентен Date.parse (string)
, за исключением того, что последний возвращает число, а не Date
). В спецификации 5-го издания было добавлено требование поддержки упрощенного (и немного некорректного) ISO-8601 (также см. Что такое допустимые строки даты и времени в JavaScript? ]). Но кроме этого, не было требований для даты.parse
/ new Date (string)
должен принимать кроме того, что они должны были принимать любой вывод Date # toString (не говоря, что это было).
Начиная с ECMAScript 2017 (издание 8), реализации требовали синтаксического анализа их вывода для Date # toString и Date # toUTCString , но формат этих строк не был указан.
Начиная с ECMAScript 2019 (выпуск 9) формат для Date # toString и Date # toUTCString , был указан как (соответственно):
предоставляет еще 2 формата, которые Date.parse должен надежно анализировать в новых реализациях (отмечая, что поддержка не является повсеместной и несовместимые реализации будут использоваться для когда-то).
Я бы порекомендовал анализировать строки даты вручную и использовать конструктор даты с аргументами года, месяца и дня, чтобы избежать двусмысленности:
// parse a date in yyyy-mm-dd format
function parseDate(input) {
var parts = input.split('-');
// new Date(year, month [, day [, hours[, minutes[, seconds[, ms]]]]])
return new Date(parts[0], parts[1]-1, parts[2]); // Note: months are 0-based
}
Хотя CMS верна , что передача строк в метод синтаксического анализа, как правило, небезопасна, новое ECMA-262 5-е издание (также известный как ES5) в разделе 15.9.4.2 предполагается, что Date.parse ()
действительно должен обрабатывать даты в формате ISO. В старой спецификации такого утверждения не было. Конечно, старые браузеры и некоторые современные браузеры по-прежнему не поддерживают эту функциональность ES5.
Ваш второй пример не ошибочен. Это указанная дата в формате UTC, как подразумевается в Date.prototype.toISOString ()
, но представлена в вашем местном часовом поясе.