В чём разница между new Date('2017-01-01') и new Date('2017-1-1')?

178
29 марта 2017, 17:24

Почему new Date('2017-01-01') и new Date('2017-1-1') выдают разное время?

Как парсится new Date(dateString) в Chrome?

[ 
  new Date("2017-01-01"), 
  new Date("2017-01-1"), 
  new Date("2017-1-1"), 
  new Date("2017-1-01") 
].forEach(date => console.log(date));

What is the difference between new Date(“2017-01-01”) and new Date(“2017-1-1”)?

Answer 1

"2017-01-01" следует ISO стандарту, и соответствует UTC времени.
Строка любого другого формата, парсится как локальное время в Chrome1.
В общем случае(в других браузерах), это поведение зависит от реализации.

1 Соответствующий исходный код в Chromium

Парсинг даты в Chromium следует правилам стандарта ES5, кроме следующих исключений:

  • Любое нераспознанное слово перед первым числом игнорируется.
  • Текст в скобках игнорируется.
  • Parenthesized text is ignored.
  • Беззнаковое число, за которым идёт : - время. Оно добавляется в TimeComposer. Число с :: означает 0 секунд. Число с . - также время, за которым должны идти миллисекунды. Любое другое число - компонент даты, добавляется в DateComposer.
  • Название месяца(любое слово, три первые буквы которого совпадают с названием месяца) распознаются как месяц в DayComposer.
  • Слово, распознаваемое как временная зона, записывается как (+|-)(hhmm|hh:).
  • Старые даты не позволяли лишних знаков +/- или несогласованной ) после прочитанного числа(перед первым числом допустим любой мусор).
  • Любые строки, удовлетворяющие и ES5 правилами и правилам выше, будут парситься по правилам ES5. Это значит, что "1970-01-01" будет в UTC, а не в локальной таймзоне.

Что это значит?

Для начала, 2017-01-01 парсится в UTC потому что это строка "даты", а не "дата-время". Она также соответствует ES5 определению строки "даты".
Если добавить время - она будет распознано в локальном часовом поясе по ISO стандарту.

Примеры:

  • 2017-01-01 - Янв 1, 2017 в UTC
  • 2017-01-01T00:00 - Янв 1, 2017 локальное время
  • 2017-1-1 - Янв 1, 2017 локальное время
  • 2017-(hello)01-01 - Янв 1, 2017 локальное время
  • май 2017-01-01 - Янв 1, 2017 локальное время
  • mayoooo 2017-01-01 - Янв 1, 2017 локальное время
  • "jan2017feb-mar01apr-may01jun" - Июн 1, 2017 локальное время

Ответ на enSO

READ ALSO
Как отключить на мобильной версии сайта скрипты?

Как отключить на мобильной версии сайта скрипты?

Здравствуйте подскажите как отключить на мобильной версии сайта ненужные скрипты ?за ранние спасибо

376
Не убирается placeholder после вставки значений в input

Не убирается placeholder после вставки значений в input

Ситуацию изобразил на изображениипосле нажатия на радио кнопку идет вставка в поля значений, при котором плейсхолдер не убирается

238
Как по нажатию показать блок с определенным атрибутом?

Как по нажатию показать блок с определенным атрибутом?

Всем привет, есть такой код, хочу реализовать чтобы по нажатию на com_review всплывал блок otpr, но дело в том что таких блоков много и поэтому работает...

336
как нажать на кнопку после перезагрузки страницы (location.reload)

как нажать на кнопку после перезагрузки страницы (location.reload)

подскажите, можно ли после перезагрузки страницы сделать какое либо действие, в моем случае нажать на кнопку или открыть всплывающее окно?...

282