Разбирайте даты ГГГГ-ММ-ДД с использованием локального часового пояса

В javascript, если я укажу дату как MM/DD/YYYY, я могу использовать new Date() для ее анализа как локального часового пояса:

>>> new Date('01/01/1970')
Date {Thu Jan 01 1970 00:00:00 GMT-0500 (EST)}

Однако, если я укажу дату как YYYY-MM-DD, она предполагает, что я даю дату в часовой пояс UTC:

>>> new Date('1970-01-01')
Date {Wed Dec 31 1969 19:00:00 GMT-0500 (EST)}

Есть ли простой способ сообщить парсеру даты использовать локальный часовой пояс при разборе дат "YYYY-MM-DD"? Или мне нужно использовать .replace(/^(\d{4})-(\d{2})-(\d{2})$/, '$2/$3/$1') для его исправления в первую очередь?

Ответ 1

Date.parse ведет себя следующим образом:

http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.4.2

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

http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15

ECMAScript определяет формат обмена строк для дат-времен, основанный на упрощении формата ISO 8601 Extended. Формат выглядит следующим образом: YYYY-MM-DDTHH: mm: ss.sssZ

Z - это смещение часового пояса, указанное как "Z" (для UTC) или "+" или "-", за которым следует выражение времени HH: mm

Значение смещения отсутствующего часового пояса - "Z".

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