Подтвердить что ты не робот

Другой результат для yyyy-mm-dd и yyyy/mm/dd в javascript при передаче в "новую дату"

Я выполнял инструкцию ниже в узле nodejs repl, и я получал два разных результата за ту же дату

var dateStr1 = "2015/03/31";
var dateStr2 = "2015-03-31";
var date1 = new Date(dateStr1);//gives Tue Mar 31 2015 00:00:00 GMT+0530 (IST)
var date2 = new Date(dateStr2);//gives Tue Mar 31 2015 05:30:00 GMT+0530 (IST)

В первый час, мин, секунды - все нули, а во втором - по умолчанию, мин устанавливается как часовой часовой час, мин, который составляет 5:30

4b9b3361

Ответ 1

Это сводится к тому, как Date.parse() обрабатывает формат даты ISO-8601.

Строка времени даты может быть в формате ISO 8601. Например, "2011-10-10" (только дата) или "2011-10-10T14: 48: 00" (дата и время) могут быть переданы и проанализированы. Часовой пояс UTC используется для интерпретации аргументов в формате ISO 8601, которые не содержат информацию о часовом поясе (обратите внимание, что проект ECMAScript ed 6 указывает, что строки времени даты без часового пояса должны рассматриваться как локальные, а не UTC)

Ваш первый формат даты 2015/03/31 предполагается до 31 марта 2015 года в 12 часов в вашем текущем часовом поясе.
Ваш второй формат даты 2015-03-31 рассматривается как ISO-8601 и предполагается, что он будет 31 марта 2015 года в 12 часовом поясе UTC.

Заголовок "Различия в предполагаемом часовом поясе" из связанной документации немного подробнее:

С учетом строки даты "7 марта 2014 года" parse() принимает локальный часовой пояс, но с учетом формата ISO, такого как "2014-03-07", он примет часовой пояс UTC. Поэтому объекты Date, созданные с использованием этих строк, будут представлять разные моменты времени, если система не установлена ​​с местным часовым поясом UTC. Это означает, что две строки дат, которые выглядят эквивалентными, могут приводить к двум различным значениям в зависимости от формата преобразуемой строки (это поведение изменяется в ECMAScript ed 6, так что оба будут считаться локальными).

Ответ 2

Первая строка, 2015/03/31, на самом деле является неподдерживаемым форматом в соответствии со стандартом ECMAScript. Всякий раз, когда неподдерживаемое значение передается конструктору, его поведение равно undefined, то есть стандарт не говорит, что должна делать реализация. Некоторые браузеры, такие как Firefox, пытаются угадать, что такое формат, и, по-видимому, он создает объект даты с этой датой в полночное местное время. Другие браузеры, такие как Safari, возвращают NaN.

Вторая строка 2015-03-31 - это правильно отформатированная дата ISO 8601. Для этих строк есть четко определенные правила, и все браузеры будут интерпретировать его как эту дату, полночь, utc.