0

以下 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的代码。

欢迎提出意见、问题或建议。

4

0 回答 0