3

我正在使用 javascript Date 对象将字段值转换为时间戳,同一段代码工作了好几年,但今天我有一个奇怪的行为,标题中有日期。

可以用下面这段代码来概括:

// 06 June 2013
DateTemp = new Date();
DateTemp.setFullYear( 2013 );
DateTemp.setMonth( 5 );
DateTemp.setDate( 6 );
DateTemp.setHours( 0 );
DateTemp.setMinutes( 0 );
DateTemp.setSeconds( 0 );
console.log( DateTemp.getMonth() ); // 5

DateTemp.setMonth( 6 );
console.log( DateTemp.getMonth() ); // 6

DateTemp.setMonth( 7 );
console.log( DateTemp.getMonth() ); // 7

我希望它会返回:5 6 7

但它输出:6 6 7

因此,如果用户在字段中输入此日期,它会在一个月后存储日期......如果有人能解释我完全搞砸的地方,请提前谢谢。

祝你今天过得愉快,

4

1 回答 1

8

将设置日期的行与设置月份的行交换:

DateTemp = new Date();
DateTemp.setFullYear( 2013 );
DateTemp.setDate( 6 );
DateTemp.setMonth( 5 );
DateTemp.setHours( 0 );
DateTemp.setMinutes( 0 );
DateTemp.setSeconds( 0 );
console.log( DateTemp.getMonth() ); // 5

DateTemp.setMonth( 6 );
console.log( DateTemp.getMonth() ); // 6

DateTemp.setMonth( 7 );
console.log( DateTemp.getMonth() ); // 7

怎么了?

如果您使用构造函数,则会创建一个具有当前new Date()日期的新 Date 对象。所以今天这将是这样的:

Date {Fri May 31 2013 14:20:32 GMT+0200}

在您的代码中,您首先将月份更改为六月。但是没有 6 月 31 日,它是由 JavaScript 以这种方式处理的,它被转换为

Date {Mon Jul 01 2013 14:21:28 GMT+0200}

之后您设置当天和所有其他部分,这一切正常。但最终,您似乎提前了一个月。

所以最后的解决方案就是改变设置值的顺序,使这种“溢出”不会发生或直接使用带有相应参数的构造函数:

new Date( 2013, 5, 6 );
于 2013-05-31T12:19:04.697 回答