Moment.js diff方法计算两日差返回0而非1的异常问题咨询
问题原因与解决方案
这个问题我之前也碰到过,核心原因是moment.js的diff方法默认的取整逻辑和你预期的「日历日期差」不一致。
为什么会返回0?
moment的diff方法默认是向下取整(截断小数部分),它计算的是两个时间点之间的完整单位周期数,而不是直接对比日历上的日期:
- 比如你当前的
moment()可能是2018-04-06 15:00:00,而date是2018-04-07 10:00:00,两者实际相差只有19小时,不到完整的24小时(1天),所以diff('days')会返回0。 - 哪怕
date是2018-04-07 00:00:00,只要当前时间是2018-04-06 23:59:59,相差仅1秒,diff还是会返回0。
两种解决方法
1. 忽略时间部分,只对比日历日期
把两个moment对象都设置为当天的开始时间(即YYYY-MM-DD 00:00:00),这样就能得到纯粹的日历日期差:
date.startOf('day').diff(moment().startOf('day'), 'days')
这个方法最适合你的场景,不管两个时间的具体时刻,只要日期差1天就会返回1。
2. 获取浮点结果后自定义取整
如果需要考虑时间差的精确性(比如差25小时算1天,差23小时也算1天),可以给diff传第三个参数true来获取浮点结果,再用Math.round/Math.ceil来处理:
// 四舍五入:差12小时以上算1天,以下算0天 Math.round(date.diff(moment(), 'days', true)) // 向上取整:只要有时间差就算1天 Math.ceil(date.diff(moment(), 'days', true))
内容的提问来源于stack exchange,提问作者Frank Roth




