我已经执行了这些简单的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
任何人都知道发生了什么事?
答案 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');