Javascript中两个日期的初始化差异

Javascript中两个日期的初始化差异,javascript,date,datetime,Javascript,Date,Datetime,为什么这两个日期不同 var date1 = new Date(); date1.setFullYear(2012); // year (four digits) date1.setMonth(10); // month (from 0-11) date1.setDate(1); // day of the month (from 1-31) var date2 = new Date(2012, 10, 1, 0, 0, 0, 0); var date3 = new Date(); date

为什么这两个日期不同

var date1 = new Date();
date1.setFullYear(2012); // year (four digits)
date1.setMonth(10); // month (from 0-11)
date1.setDate(1); // day of the month (from 1-31)

var date2 = new Date(2012, 10, 1, 0, 0, 0, 0);
var date3 = new Date();
date3.setFullYear(2012); // year (four digits)
date3.setMonth(9); // month (from 0-11)
date3.setDate(1); // day of the month (from 1-31)

var date4 = new Date(2012, 9, 1, 0, 0, 0, 0);
结果:

Date 1 : Sat Dec 01 2012 14:56:16 GMT+0100
Date 2 : Thu Nov 01 2012 00:00:00 GMT+0100
Date 3 : Mon Oct 01 2012 14:56:16 GMT+0200
Date 4 : Mon Oct 01 2012 00:00:00 GMT+0200
而这两个日期是相等的:

var date1 = new Date();
date1.setFullYear(2012); // year (four digits)
date1.setMonth(10); // month (from 0-11)
date1.setDate(1); // day of the month (from 1-31)

var date2 = new Date(2012, 10, 1, 0, 0, 0, 0);
var date3 = new Date();
date3.setFullYear(2012); // year (four digits)
date3.setMonth(9); // month (from 0-11)
date3.setDate(1); // day of the month (from 1-31)

var date4 = new Date(2012, 9, 1, 0, 0, 0, 0);
结果:

Date 1 : Sat Dec 01 2012 14:56:16 GMT+0100
Date 2 : Thu Nov 01 2012 00:00:00 GMT+0100
Date 3 : Mon Oct 01 2012 14:56:16 GMT+0200
Date 4 : Mon Oct 01 2012 00:00:00 GMT+0200

另一个问题是为什么
date1.setMonth(10)
给出了12月(应该是11月)的日期。

您正在创建一个包含当前日期(
new date()
)的var,然后您正在更改它的一些键(年、月和日)

另一方面
新日期(2012、10、1、0、0、0、0)
意味着“使用这些精确值创建一个日期对象”


这就是为什么日期对象不相等。

最终得到了它<代码>新日期()将日期设置为当前日期和时间。换句话说,10月31日(撰写本文时)

当你尝试将月份设置为11月时,它会做什么?十一月只有30天。。。所以它结束到十二月

如果您更改订单,以便在该月的前一个月设置日期,则该命令将起作用:

var date1 = new Date();
date1.setFullYear(2012); // year (four digits)
date1.setDate(1); // day of the month (from 1-31)
date1.setMonth(10); // month (from 0-11)
或者正如jbabey的回答所暗示的:

var date1 = new Date();
date1.setFullYear(2012); // year (four digits)
date1.setMonth(10, 1); // month (from 0-11) and day (1-31)
虽然不太清楚,但至少有启发性:

如果指定的参数超出预期范围,setMonth将尝试相应地更新date对象中的日期信息。例如,如果您使用15表示monthValue,则年份将递增1(year+1),3表示月份

(“因此”远非精确,但它意味着实现至少可以说是正确的…

接受第二个参数:

如果不指定dayValue参数,则使用从getDate方法返回的值


当您将月份设置为
10
(11月)时,它将获取当前日期值(
31
)并将其设置为日期。由于11月只有30天,它会把你推到12月1日。

这真的是你的准确代码吗?@JonSkeet只要复制他的第一个代码块,核心问题就可以重现。如果你只是指时间部分,这并不能解释为什么试图将月份设置为11月实际上会将月份设置为12月。感谢@Jon Skeet的解释和对文档的参考。我知道会发生什么!第三个解决方案是在我的问题
新日期(2012,10,1,0,0,0,0)