我必须计算两个日期之间经过多少年。我的代码工作正常 - 除了非常具体的日期。
下面的代码应该为dateEnd
和dateEnd1
生成相同的年份差异,但它们并不相同。如果我从2003年到2004年改变年份,它将变得平等。如果我要离开这一年,但从3月到2月再改变,它将再次平等。
我想这与闰年有关,但我为何无能为力?特别是因为在那个时期有4个闰年,但是这一年的错误计算只发生在相隔一天的日期。
我预计在这两种情况下,年差异为12,但在第一种情况下我使用dateEnd
变量得到13
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.
答案 0 :(得分:2)
这与语言环境无关。当我将日期更改为2016年的任何其他月份(1月或2月除外)时,我也会得到12/13的结果。所以原因是2016年是闰年,2003年不是。
这证明将日期差异计算为日期是不可靠的。为了计算年份的差异,您需要使用两个日期的年份部分。同时比较月份部分,如果结束月份在开始月份之前,则减去一年,如果开始月份和结束月份相同,则也比较月份日期。如果需要,您还可以包括小时,分钟,秒和毫秒。
答案 1 :(得分:2)
can /不能重现差异不是语言环境,而是时区。对我(在加利福尼亚州),上述值给出:
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指出的那样,它并不那么简单,确实涉及闰年。