乐者为王

Do one thing, and do it well.

《Java和JavaScript关于日期计算上的差异》阅读笔记

下面是《Java和JavaScript关于日期计算上的差异》作者给出的结论:

当进行日期计算的时候,当前日期的月份必须是大月,并且是在这个月的最后一天也就是31号,比如2008-3-31号,当给这个日期加上一个月,得到的日期是个小月就会出现这样的情况。比如在2008-3-31这天加上一月,那因该是4月份,4月就是小月,那Java就是4月30号,JavaScript 就是5月1号,相差一天。当加上2月后,就是5月,5月是大月,那么计算的结果都是5月31号。

不过这样的结论还是不能让人明白Java和JavaScript计算日期时相差的一天是怎么来的。

以下是我对Java和JavaScript日期计算差异的一些理解:

2008-2-29加上12个月,那么就是2009-2-29,但2009年是非闰年,它的2月份只有28天,这样就多出来的一天。如何处理这多出来的一天呢?Java和JavaScript做出了不同的理解。Java认为,既然2009年的2月只有28天,那么那多出来的一天就是多余的,应该丢弃,所以Java的计算结果是2009-2-28;而JavaScript则认为这多出来的一天不能丢弃,应该也加上去。那么2009-2-28号加上一天就是2009-3-31号。

同样的,2008-3-31加上一个月在Java中的结果是2008-4-30号,而在JavaScript中则是2008-5-1号。那如果加上的是两个月呢?2008-3-31加上两个月是2008-5-31号,是有效的日期,所以Java和JavaScript的计算结果都是2008-5-31号。

结论是,当进行日期计算时,如果结果日期的date值超出了该月的最大天数值,那么在Java中就会将该date值设为该月的最大天数值;而JavaScript则不但会将该date值设为该月的最大天数值,还会再加上超出的天数值。例如:2009-1-31号加上一个月,Java的结果就是2009-2-28号,JavaScript的结果则是2009-3-3号,2009-2-28加多出来的3 = 31 - 28天。

Comments