Ответ 1
Все о том, как браузер реализует Date.parse
(spec). Этот метод вызывается в строке, переданной в конструктор Date
(spec) и сначала пытается сопоставить строку с известным форматом, чтобы определить, что значения - это где. Я ожидаю, что различные браузеры будут реализовывать это дерево решений несколько иначе, но реализация Chrome, вероятно, предполагает, что версия "2012-01-01"
является префиксом ISO-8601, который основан на Zulu или GMT/UTC, и включает часовой пояс ("2012-01-01T00:00:00Z-07:00"
), в то время как версия "01-01-2012"
является локализацией на основе вашего локального часового пояса и не требует указания ее ("01-01-2012 00:00:00"
), поэтому разница в 7 часов основана на смещении за 7 часов между стандартной датой ISO и локализованной датой. Date.prototype.toString()
(spec), напротив, предполагается отображать локальное время и возвращается конструктором Date
, поэтому он локализован в обоих возвращаемых значениях из вашего теста.
Из spec для Date.parse
:
Функция сначала пытается проанализировать формат строки в соответствии с правилами, выписанными в формате строки времени даты (15.9.1.15). Если String не соответствует этому формату, функция может вернуться к любым эвристикам, специфичным для реализации, или форматам дат реализации. Неузнаваемые строки или даты, содержащие недопустимые значения элементов в формате String, должны вызывать Date.parse для возврата NaN.
Значение, если вы не используете полную дату ISO-8601, указанную в 15.9.1.15, браузер может решить, как это происходит или просто дайте вам NaN
. Несмотря на то, что это стандарт, некоторые браузеры печально известны не стандартами FOLLOWING, поэтому вы можете просто указать все параметры однозначно, самостоятельно проанализировав данные и используя другой конструктор Date
(spec).