2

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

IE

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

这个概念的一般思想是,由于没有 32 天的月份,构造函数将在下个月内创建一个日期。我什至看到了带有负溢出的代码示例:

IE

// 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);

进一步检查最终发现,像 new Date(2013,0,23) 或 new Date(2013,0,16) 结合 setDate(-1) 这样的日期都以“2012-12-31”结尾。最后我观察到使用 -1 似乎减少了两天(为了获得预期的结果 setDate(0) 必须使用)。

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

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

4

2 回答 2

7

来自MDN

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

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

[..] 代码示例是否在互联网垃圾中传播?

是的。这至少在 90% 的情况下是正确的。

于 2013-01-02T11:44:20.353 回答
3

MDN,他们说:

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

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

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

编辑:如果你认为它仅仅是一个相对值,它可能看起来违反直觉,例如 PHP 的strtotime()函数:

strtotime('-1 day');

事实并非如此;-)

于 2013-01-02T11:46:40.207 回答