以下 JavaScript 产生如下所示的结果:
dat0 = new Date(2012, 9, 31);
dat0.setMonth(dat0.getMonth() + 1); // Oct 31 + 1 month = Dec. 1
dat1 = new Date(2011, 0, 31); // Jan 31 (non leap year)
dat1.setMonth(dat1.getMonth() + 1); // Mar 3
dat2 = new Date(2012, 0, 31); // Jan 31 (leap year)
dat2.setMonth(dat2.getMonth() + 1); // Mar 2
dat3 = new Date(2011, 11, 31); // Dec 31
dat3.setMonth(dat3.getMonth() - 1); // minus one month is Dec 1
dat4 = new Date(2011, 10, 30); // Nov 30
dat4.setMonth(dat4.getMonth() - 1); // minus one month is Oct 30
alert(dat0 + "\n" + dat1 + "\n" + dat2 + "\n" + dat3 + "\n" + dat4);
我已经在 IE 9 和 Chrome 中对此进行了测试,结果是一样的。因此,我可以假设所有 JavaScript 实现都会产生相同的结果吗?换句话说,这些结果是由公认的标准决定的吗?
(在 10 月 31 日增加一个月会导致 12 月 1 日,我并不感到惊讶。但我发现非常令人惊讶的是,在 1 月 31 日增加一个月会导致 3 月的两个不同日期,而这两个日期都不是 3 月 1 日。)
看到这个jsFiddle。
相关说明:对于那些感兴趣的人,我正在编写一个closure
旨在处理超出Date
对象提供的附加日期数学功能的程序。(加/减月份、两个日期之间的月份、一个月的最后一天、闰年等)我知道我可以扩展Date
对象(通过原型),但有理由不这样做。无论如何,有一个addMonths
函数,当 1 月 31 日加一个月时,返回的结果始终是 2 月的最后一天。10 月 31 日加一个月返回 11 月 30 日。
您可以尝试使用此jsFiddle的代码。
欢迎提出意见、问题或建议。