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

Как объяснить разницу в конструкторе даты?

Тест:

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

Я думаю, что разница исходит от часовых поясов, но я этого совсем не понимаю!

Какое волшебное вещество производит эту разницу?

4b9b3361

Ответ 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. Когда вы создаете его с помощью конструктора, вы получаете свой обычный язык.