Javascript 如何解释日期构造函数的差异?

Javascript 如何解释日期构造函数的差异?,javascript,date,Javascript,Date,测试: 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 我认为差异来自时区,但我一点也不明白 什么神奇的东西会产生这种差异?您的I

测试:

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
我认为差异来自时区,但我一点也不明白


什么神奇的东西会产生这种差异?

您的ISO日期字符串有一个明确的UTC时区,因此它被解释为UTC。第二个日期由日期部分的数字参数构成,这意味着构建日期隐式使用本地时区

还请注意,日期字符串中的“4”表示“四月”,而第二个构造函数中的“4”表示“五月”:使用数字构造函数时,月份从零开始编号,而不是从一开始编号。

我认为这是最好的:

注意:当Date作为具有多个参数的构造函数调用时,指定的参数表示本地时间。如果需要UTC,请使用具有相同参数的新日期(Date.UTC(…)


换句话说,当您使用字符串构造函数时,您将获得UTC。当您使用构造函数创建一个日期实例时,您将获得正常的区域设置。

最大的问题是,在Javascript中,月份是0索引的,在创建第二个日期实例时,4表示可能。此外,您的字符串还包括用于时区的+00:00,即UTC/GMT。您的第二个字符串不提供时区信息,因此它将是本地时区

如果您希望UTC日期的构造与您的UTC日期相似,您可以调用:

var d2 = new Date(Date.UTC(2000, 3, 22, 0, 0, 0, 0)); 

这是因为您的时区
新日期(Date.UTC(2000,4,22,0,0,0,0))
以获得预期结果。这解决了UTC问题,使用正确的月份索引,它将成为
新日期(Date.UTC(2000,3,22,0,0,0,0))并且它工作
UTC
不是一个构造器,银行,固定,忘了写日期。我们又见面了,你仍然很棒。