我目前正在编写某种基于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是否可以被所有主流浏览器统一使用?
答案 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');
事实并非如此; - )