没有找到2月15日

时间:2008-10-30 22:10:05

标签: javascript date

我在javascript中,在控制台中运行

d = new Date();             
d.setMonth(1);
d.setFullYear(2009);
d.setDate(15);                                  
d.toString();

输出:

"Sun Mar 15 2009 18:05:46 GMT-0400 (EDT)"

为什么会这样?这似乎是一个浏览器错误。

5 个答案:

答案 0 :(得分:30)

那是因为当你初始化一个新的日期时,它来自今天的日期,所以今天是2008年10月30日,然后你将月份设置为2月,所以没有2月30日,所以首先设置日期,然后是月份,然后是一年:

d = new Date();
d.setDate(15);                    
d.setMonth(1);
d.setFullYear(2009);   

但是@Jason W表示最好使用Date构造函数:

new Date(year, month, date [, hour, minute, second, millisecond ]);

答案 1 :(得分:27)

最好一步构造一个Date对象,以避免Date对象处于模糊或无效状态:

d = new Date(2009, 1, 15);

答案 2 :(得分:1)

d = new Date();
d.setDate(15);                    
d.setMonth(1);
d.setFullYear(2009);                                                                 
d.toString();

这很有效。

答案 3 :(得分:0)

在XP上使用Firebug进行了一系列测试后,我可以告诉你这些事情

  • 在调用Date.setMonth()之后调用Date.setDate()会产生这种奇怪的行为。
  • Date.setMonth()强制时区为CST(或某些非DST感知区域)
  • Date.setDate()强制时区为CDT(或某些支持DST的区域)

所以,对于时区,使用setMonth()和setDate()肯定会有些不可思议。

我能提供的唯一解决方案是:在设定月份前设定日期。

答案 4 :(得分:0)

这通常可以避免javascript Date API的rollover behavior

d.setDate(1);
d.setFullYear(year);
d.setMonth(month);
d.setDate(day);

鉴于年+月+日是“有效”组合,例如使用getFullYear(),getMonth(),getDate()从另一个Date对象获取。

重要的部分是:

  • setDate(1)开始,以避免在当前日期值为29,30或31
  • 时发生翻转
  • setMonth(month)之前调用setDate(day),以避免在当前月份值“有问题”的情况下进行相同的翻转(因为那时初始setDate(1)将无效)