Dan*_*iel 0 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()
Run Code Online (Sandbox Code Playgroud)
输出
1.0020739645577939
0.9993360575508053
0.9993360575508053
0.9993360575508053
Run Code Online (Sandbox Code Playgroud)
当然,一定有问题吗?
或许这种异常与闰年有关?2012年是闰年
所以我尝试了2016年的下一个闰年
moment.duration(moment(new Date(2016,1,1)).diff(moment(new Date(2015,1,1)))).asYears()
Run Code Online (Sandbox Code Playgroud)
其输出与之前的非闰年相同,所以可能与之无关
0.9993360575508053
Run Code Online (Sandbox Code Playgroud)
任何人都知道发生了什么事吗?
你在几秒钟内取得差异,然后要求Moment将其转换为年; 你永远不会得到那种确切的价值.你应该首先要求Moment在几年内给出差异:
moment(new Date(2013,1,1)).diff(moment(new Date(2012,1,1)),'year');
Run Code Online (Sandbox Code Playgroud)
如果您希望结果包含一年的分数而不是截断为整数,请将第三个参数添加到diff:
moment(new Date(2013,1,1)).diff(moment(new Date(2012,1,1)),'year', true);
Run Code Online (Sandbox Code Playgroud)
您的方法无效,因为日历年不是固定的秒数.它是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 ...年.