JavaScript Date Bug 2014年2月

Gil*_*y67 2 javascript date

所以我有这个JS代码:

var d1 = new Date();
d1.setFullYear(2014);
d1.setMonth(1);
d1.setDate(1);
Run Code Online (Sandbox Code Playgroud)

应该是2014年2月1日,对吧?只有它不是......它返回Mar-01-2014(实际上,完整值是"2014年3月1日20:54:29 GMT + 0100(浪漫标准时间)").我勒个去?任何其他日期值都会发生同样的事情.

但是,如果我使用此代码,它可以正常工作:

var d1 = new Date(2014, 1, 1, 0, 0, 0, 0);

其结果是:2014年2月1日星期六00:00:00 GMT + 0100(浪漫标准时间)

有什么想法发生了什么?

Nik*_*las 5

这是正在发生的事情,一行一行:

您使用今天的日期创建一个新的日期对象.

var d1 = new Date(); // d1 = 2014-04-30
Run Code Online (Sandbox Code Playgroud)

然后你将年份设置为2014年,它已经是,所以没有真正发生.

d1.setFullYear(2014); // d1 = 2014-04-30
Run Code Online (Sandbox Code Playgroud)

这是棘手的部分,因为现在你将月份改为2月份.但这会使2月30日(2014-02-30)日期不存在,因此JavaScript将尝试找到最接近的有效日期,即March(2014-03-01)的第一个.

d1.setMonth(1); // d1 = 2014-02-30 is not valid so JS makes it 2014-03-01
Run Code Online (Sandbox Code Playgroud)

然后你将日期设置为月份的第一天,它已经是,所以这里也没有真正发生.

d1.setDate(1) // d1 = 2014-03-01
Run Code Online (Sandbox Code Playgroud)