二月十五是'未找到

The fifteenth of February isn't found

本文关键字:二月      更新时间:2023-09-26

我在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)"

为什么会发生这种情况?这似乎是一个浏览器错误。

这是因为当你初始化一个新的日期时,它会附带今天的日期,所以今天是2008年10月30日,然后你将月份设置为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 ]);

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

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

这是有效的。

在XP上用Firebug在FF3中进行了一系列测试后,我可以告诉你

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

因此,关于时区,setMonth()和setDate()肯定有一些不稳定的地方。

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

这通常可以避免javascript日期API:的滚动行为

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

假设年+月+日是一个"有效"的组合,例如使用getFullYear()、getMonth()和getDate()从另一个Date对象中获取。

重要部分包括:

  • setDate(1)开始,以避免当前日期值为29、30或31时可能发生的滚动
  • setDate(day)之前调用setMonth(month),以避免在当前月份值"有问题"的情况下进行相同的滚动(因为这样初始的setDate(1)将无效)