Javascript日期构造函数中的日溢出

时间:2013-01-02 11:37:14

标签: javascript

我目前正在编写某种基于javascript的客户端日历并观察到一些问题。在整个网络中,我可以找到代码示例,人们在Date构造函数中使用日溢出。

// get the first day of the next month
var myDate = new Date(someDate.getFullYear(),someDate.getMonth(),32);
myDate.setDate(1);

这个概念的一般概念是,由于没有32天的月份,构造函数将在下个月内创建一个日期。我甚至看到带有负溢出的codeample:

// get the last day of the previous month
var myDate = new Date(someDate.getFullYear(),someDate.getMonth(),1);
myDate.setDate(-1);

虽然这在许多情况下似乎都有效,但我终于找到了一个矛盾:

// this prints "2012-12-30" expected was "2012-12-31"
var myDate = new Date(2013,0,1);
myDate.setDate(-1);
进一步检查终于透露出日期如此 新日期(2013,0,23)或新日期(2013,0,16)与setDate(-1)相结合均以“2012-12-31”结尾。最后我发现使用-1似乎减去了两天(为了得到预期的结果,必须使用setDate(0))。

这是浏览器实现中的错误还是代码示例在互联网上传播?

此外,这个具有正负溢出安全性的setDate是否可以被所有主流浏览器统一使用?

2 个答案:

答案 0 :(得分:6)

来自MDN

  

如果您指定的参数超出预期范围,setDate会尝试相应地更新Date对象中的日期信息。例如,如果对dayValue使用0,则日期将设置为上个月的最后一天。

如果您考虑一下,这是合乎逻辑的:setDate(1)将日期设置为该月的第一天。要获取上个月的最后一天,也就是本月的第一天,您从参数中减去一个并获得0。如果您减去两天(1 - 2),则会获得倒数第二天(-1)。

  

是[..]代码样本在互联网废话中传播?

是。至少90%的情况都是如此。

答案 1 :(得分:3)

MDN他们说:

  

如果您指定的参数超出预期范围,则为setDate   尝试更新Date对象中的日期信息   因此。例如,如果对dayValue使用0,则日期为   设置为上个月的最后一天。

所以你得到了连贯的结果:

 1 - Jan 1
 0 - Dec 31
-1 - Dec 30
-2 - Dec 29

编辑:如果您将其视为仅仅相对值,例如PHP的strtotime()函数,则可能看起来违反直觉:

strtotime('-1 day');

事实并非如此; - )