Moment JS diff()计算10月31日与11月1日天数差返回0问题排查
问题结论
这是 MomentJS 本身的设计逻辑导致的非预期结果,和 Node.js v14.15.4 运行环境无关。
原因说明
你碰到的现象是夏令时/冬令时切换场景下的典型边界问题:
- 你给出的示例中两个时间换算为UTC后刚好间隔24小时,但由于切换冬令时后当天当地时区的一天长度为25小时,Moment 计算天级差值时没有采用固定86400000毫秒作为一天的长度,而是动态适配了当前时区的一天长度,导致24小时的间隔没有被判定为1天,最终返回0的非预期结果。
- 你认为这是Moment的bug的判断是合理的,这确实是Moment已知的、未修复的差值计算逻辑问题。
解决方案
如果你需要计算日历日期的差值(即只看日期数字的差,不考虑具体时间和时区偏移),只需将两个Moment对象都调整到当日零点后再计算差值即可:
// 正确写法,返回结果为 -1,符合预期 a.startOf('day').diff(b.startOf('day'), 'days')
额外建议
目前 MomentJS 官方已经停止了新功能开发和问题修复,仅做安全维护。如果你的项目还在迭代,建议优先迁移到 date-fns、Luxon 等更现代的日期处理库,这类时区相关的计算逻辑在新库中会更严谨,踩坑概率更低。
内容的提问来源于stack exchange,提问作者Marc
相关产品推荐
相关产品推荐

