3

我必须计算两个日期之间经过了多少年。我的代码工作正常 - 除了非常具体的日期。

dateEnd下面的代码应该为和产生相同的年份差异dateEnd1,但是它们并不相等。如果我将年份从 2003 年更改为 2004 年,它将变得相等。如果我离开这一年,但从三月改为二月,它又会是平等的。

我想这与闰年有关,但我不知道为什么?特别是因为那段时间有 4 个闰年,但是仅相隔一天的日期会发生年份错误计算。

在这两种情况下,我预计年差为 12,但是在第一种情况下,我得到 13 的dateEnd变量

var dateStart = '2003,03,11';
var dateEnd = '2016,03,10';
var dateEnd1 = '2016,03,09';

var difference = (new Date(dateEnd)).getTime() - (new Date(dateStart)).getTime();
difference = (new Date(difference)).getFullYear() - 1970;
alert('Between ' + dateStart + ' and ' + dateEnd + ' elapsed ' + difference + ' years.');
difference = (new Date(dateEnd1)).getTime() - (new Date(dateStart)).getTime();
difference = (new Date(difference)).getFullYear() - 1970;
alert('Between ' + dateStart + ' and ' + dateEnd1 + ' elapsed ' + difference + ' years.');

这是jsfiddle上的代码。评论中的一个人设法在他的jsfiddle上重现了这个问题!

这是我得到的变量值

dateStart time: 1047337200000
dateEnd time: 1457564400000
dateEnd1 time: 1457478000000
Time difference for the first case: 410227200000
Between 2003,03,11 and 2016,03,10 elapsed 13 years.
Time difference for the second case: 410140800000
Between 2003,03,11 and 2016,03,09 elapsed 12 years.
4

2 回答 2

2

这与语言环境无关。当我将日期更改为 2016 年的任何其他月份(1 月或 2 月除外)时,我也会得到 12 / 13 结果。所以原因是 2016 年是闰年,而 2003 年不是。

这证明了将日期差异计算为日期是不可靠的。为了计算年份的差异,您需要使用两个日期的年份部分。还要比较月份部分,如果结束月份在开始月份之前,则减去一年,如果开始月份和结束月份相同,则也比较月份中的日期。如果需要,您还可以包括小时、分钟、秒和毫秒。

于 2013-03-22T22:03:47.620 回答
2

可以/不能重现的区别不是语言环境,而是时区。对我来说(在加利福尼亚州),上述值给出:

alert(new Date(410140800000)); // "Thu Dec 30 1982 16:00:00 GMT-0800 (Pacific Standard Time)"
alert(new Date(410227200000)); // "Fri Dec 31 1982 16:00:00 GMT-0800 (Pacific Standard Time)"

如果我在格林威治标准时间或以东,第二个日期将是“1983 年 1 月 1 日星期六......”,给出不同的年数。闰年可能会进入它,因为闰年​​的数量会影响差异的天数。

认为如果您使用 2005/2018 年,您会看到同样的情况,但正如 Arjan 指出的那样,它并不是那么简单,并且确实涉及闰年。

于 2013-03-22T22:17:15.970 回答