Moment.js计算两个日期间隔时长未得到预期结果问题
问题原因
- 你错误使用了Moment.js的内部私有属性
_data,所有以下划线开头的属性都是Moment内部维护的,对外不保证返回值的准确性和稳定性,禁止在业务代码中直接访问。 - 你通过毫秒差值转换为duration再拆分年月日的计算逻辑本身存在精度问题:Moment的duration做单位拆分时,年的基准长度为回归年(约365.2425天),月的基准长度为回归年/12(约30.4375天),你给出的两个时间差值刚好为365天,小于回归年长度,所以拆分后年字段为0,剩余时长被拆分为11个月+30天,和你看到的输出一致。
diff返回的31536000000就是365天的总毫秒数,这个返回值是正确的,问题出在后续的duration拆分取值逻辑。
正确实现方式
计算两个日期的年龄差值,直接使用diff方法指定单位为year即可,不需要额外处理duration:
const now = moment(current) const bday = moment(birthday) // 第二个参数指定差值单位为年,默认向下取整 const age = now.diff(bday, 'year') console.log(age) // 输出符合预期的1
如果需要获取精确的年份差值,可以传入第三个参数为true:
const exactAge = now.diff(bday, 'year', true) console.log(exactAge) // 输出约0.9993,和365/365.2425的计算结果一致
如果你确实需要使用duration,也要使用官方提供的公开API取值,不要访问_data:
const diff = now.diff(bday) const duration = moment.duration(diff) console.log(duration.years()) // 输出1 console.log(duration.asYears()) // 输出精确的浮点年份值
内容的提问来源于stack exchange,提问作者user3142695
相关产品推荐
相关产品推荐

