Как объяснить разницу в конструкторе даты?
Тест:
var d1 = new Date("2000-04-22T00:00:00+00:00");
var d2 = new Date(2000, 4, 22, 0, 0, 0, 0);
console.log("d1 = " + d1.getTime());
console.log("d2 = " + d2.getTime());
Результат:
d1 = 956361600000
d2 = 958946400000
Я думаю, что разница исходит от часовых поясов, но я этого совсем не понимаю!
Какое волшебное вещество производит эту разницу?
Ответы
Ответ 1
Самая большая проблема заключается в том, что месяцы индексируются в Javascript, при создании второго экземпляра даты 4 означает May. Кроме того, ваша строка включает в себя +00: 00 для целей часового пояса, что соответствует UTC/GMT. Вторая информация не содержит информации о часовом поясе, поэтому это будет локальный часовой пояс.
Если вы хотите, чтобы дата UTC была построена аналогично тому, как вы ее получили, вы можете позвонить:
var d2 = new Date(Date.UTC(2000, 3, 22, 0, 0, 0, 0));
Ответ 2
Строка даты ISO имеет явный часовой пояс UTC, поэтому она интерпретируется как UTC. Вторая дата построена с числовыми параметрами для деталей даты, и это средство построения даты неявно использует локальный часовой пояс.
Также обратите внимание, что "4" в строке даты означает "Апрель", а "4" во втором конструкторе означает "Май": при использовании числового конструктора месяцы нумеруются с нуля, а не один.
Ответ 3
Я думаю, что это лучше описанное в документации:
Примечание. Если Date вызывается как конструктор с несколькими аргументами, указанные аргументы представляют собой локальное время. Если требуется UTC, используйте новую дату (Date.UTC(...)) с теми же аргументами.
Другими словами, когда вы используете конструктор строк, вы получаете UTC. Когда вы создаете его с помощью конструктора, вы получаете свой обычный язык.