Почему Date.parse дает неправильные результаты?

Заключите тот в корпус:

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)


Почему второй синтаксический анализ является неправильным?

326
задан RobG 28 March 2016 в 02:03
поделиться

2 ответа

До выхода спецификации 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 , был указан как (соответственно):

  1. ddd MMM DD YYYY HH : mm: ss ZZ [(название часового пояса)]
    например Вт 10 июля 2018 г. 18:39:58 GMT + 0530 (IST)
  2. ддд, ДД МММ ГГГГ ЧЧ: мм: сс Z
    например. Вт, 10 июля 2018 г. 13:09:58 GMT

предоставляет еще 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
}
433
ответ дан 23 November 2019 в 00:50
поделиться

Хотя CMS верна , что передача строк в метод синтаксического анализа, как правило, небезопасна, новое ECMA-262 5-е издание (также известный как ES5) в разделе 15.9.4.2 предполагается, что Date.parse () действительно должен обрабатывать даты в формате ISO. В старой спецификации такого утверждения не было. Конечно, старые браузеры и некоторые современные браузеры по-прежнему не поддерживают эту функциональность ES5.

Ваш второй пример не ошибочен. Это указанная дата в формате UTC, как подразумевается в Date.prototype.toISOString () , но представлена ​​в вашем местном часовом поясе.

4
ответ дан 23 November 2019 в 00:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: