Javascript Date对象奇怪的行为/ bug?

时间:2011-05-31 17:13:47

标签: javascript date

我正在使用javascript Date对象并看到非常奇怪的行为。如果我继续将日期对象设置为另一个日期对象+偏移量,它将开始添加30天左右。如果我在两次尝试之间重置日期对象,或者如果我在同一个对象上执行日期数学运算,它会按预期工作。

可能更容易看到我正在使用最新的chrome / ff运行的测试床:

var date = new Date();
console.log("start:", date);

var test = new Date();
test.setDate( date.getDate() + 1 );
console.log("test1:", date, test);
test.setDate( date.getDate() + 1 );
console.log("test2:", date, test);
test.setDate( date.getDate() + 1 );
console.log("test3:", date, test);

test = new Date();
test.setDate( date.getDate() + 1 );
console.log("test reset 1:", date, test);
test = new Date();
test.setDate( date.getDate() + 1 );
console.log("test reset 2:", date, test);
test = new Date();
test.setDate( date.getDate() + 2 );
console.log("test reset 3:", date, test);

test = new Date();
test.setDate( test.getDate() + 1 );
console.log("test selfref 1:", test);
test.setDate( test.getDate() + 1 );
console.log("test selfref 2:", test);

我得到的输出:

"start:" Tue May 31 2011 13:09:13 GMT-0400 (EDT)
"test1:" Tue May 31 2011 13:09:13 GMT-0400 (EDT) Wed Jun 01 2011 13:09:13 GMT-0400 (EDT)
"test2:" Tue May 31 2011 13:09:13 GMT-0400 (EDT) Sat Jul 02 2011 13:09:13 GMT-0400 (EDT)
"test3:" Tue May 31 2011 13:09:13 GMT-0400 (EDT) Mon Aug 01 2011 13:09:13 GMT-0400 (EDT)
"test reset 1:" Tue May 31 2011 13:09:13 GMT-0400 (EDT) Wed Jun 01 2011 13:09:13 GMT-0400 (EDT)
"test reset 2:" Tue May 31 2011 13:09:13 GMT-0400 (EDT) Wed Jun 01 2011 13:09:13 GMT-0400 (EDT)
"test reset 3:" Tue May 31 2011 13:09:13 GMT-0400 (EDT) Thu Jun 02 2011 13:09:13 GMT-0400 (EDT)
"test selfref 1:" Wed Jun 01 2011 13:09:13 GMT-0400 (EDT)
"test selfref 2:" Thu Jun 02 2011 13:09:13 GMT-0400 (EDT)

所以你可以看到test1-3原始日期对象保持不变,但测试对象应始终是原始日期+ 1天 - 遍布整个地方。

随后,重置测试和selfref测试似乎按预期工作。

这是一个错误还是我误解了什么?

费利克斯

3 个答案:

答案 0 :(得分:2)

您正在设置通话中的某一天。由于今天是31-st,你将日期设置为32-nd,这反过来给你下个月(通过减去其中的天数)。呼叫每次都在修改日期,因此日期会增加。 虽然后续对setDate(1)的调用不会进行任何更改,但调用setDate(32)会将对象“移动”到下个月。

答案 1 :(得分:0)

您继续从date.getDate()+ 1

添加32天

如果您更改为

var test = new Date();
test.setDate( test.getDate() + 1 );
console.log("test1:", date, test);
test.setDate( test.getDate() + 1 );
console.log("test2:", date, test);
test.setDate( test.getDate() + 1 );
console.log("test3:", date, test);

你得到了

start: Date {Tue May 31 2011 19:21:34 GMT+0200 (CEST)}
test1: Date {Tue May 31 2011 19:21:34 GMT+0200 (CEST)} Date {Wed Jun 01 2011 19:21:34 GMT+0200 (CEST)}
test2: Date {Tue May 31 2011 19:21:34 GMT+0200 (CEST)} Date {Thu Jun 02 2011 19:21:34 GMT+0200 (CEST)}
test3: Date {Tue May 31 2011 19:21:34 GMT+0200 (CEST)} Date {Fri Jun 03 2011 19:21:34 GMT+0200 (CEST)}

答案 2 :(得分:0)

当您调用“test.setDate()”时,修改日期对象。因此,“测试”的值每次都会改变;结果因此并不令人惊讶。

您每次将日期(星期几)设置为32。第一次让你前进到六月。第二个电话有效地将日期设置为“6月32日”,这实际上是“7月2日”(6月只有30天)。然后,您将日期设置为7月32日,即8月1日。