为什么不和moment.js年差异不完全匹配1?

时间:2015-08-05 20:00:55

标签: javascript datetime momentjs

我已经执行了这些简单的JS代码行

moment.duration(moment(new Date(2013,1,1)).diff(moment(new Date(2012,1,1)))).asYears()
moment.duration(moment(new Date(2012,1,1)).diff(moment(new Date(2011,1,1)))).asYears()
moment.duration(moment(new Date(2011,1,1)).diff(moment(new Date(2010,1,1)))).asYears()
moment.duration(moment(new Date(2010,1,1)).diff(moment(new Date(2009,1,1)))).asYears()

输出

1.0020739645577939
0.9993360575508053
0.9993360575508053
0.9993360575508053

当然,一定有问题吗?

或许或许这种异常与闰年有关? 2012年是闰年

所以我尝试了2016年的闰年

moment.duration(moment(new Date(2016,1,1)).diff(moment(new Date(2015,1,1)))).asYears()

输出与之前的非闰年相同,所以可能与之无关

0.9993360575508053

任何人都知道发生了什么事?

2 个答案:

答案 0 :(得分:6)

你在几秒钟内取得差异,然后要求Moment将其转换为年;你永远不会得到那种确切的价值。你应该首先要求Moment在几年内给出差异:

moment(new Date(2013,1,1)).diff(moment(new Date(2012,1,1)),'year');

如果您希望结果包含一年的分数而不是被截断为整数,请将第三个参数添加到diff

moment(new Date(2013,1,1)).diff(moment(new Date(2012,1,1)),'year', true);

您的方法无效,因为日历年不是固定的秒数。它是365天,即31,536,000秒,或366天,即31,622,400秒。由于闰年大约每四年发生一次,平均年为365.25天,即31,557,600秒;更确切地说,在现代格里高利历中,闰年规则意味着超过400个历年的一年的平均长度恰好是365.2425天,即31,556,952秒。

Moment.js使用最后一个值 - 这是有效的,但只是平均值。周年纪念日不是400年的精确倍数,永远不会给你一个整数结果。相反,实际日历常年将计为31,536,000 / 31,556,952 = 0.99933605755085028689843 ...一年,而闰年将计为31,622,400 / 31,556,952 = 1.00207396455779379453376886 ...年。

答案 1 :(得分:0)

尝试使用:

moment(new Date(2013,1,1)).diff(moment(new Date(2012,1,1)),'year');