You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Moment.js diff方法计算两日差返回0而非1的异常问题咨询

问题原因与解决方案

这个问题我之前也碰到过,核心原因是moment.js的diff方法默认的取整逻辑和你预期的「日历日期差」不一致

为什么会返回0?

moment的diff方法默认是向下取整(截断小数部分),它计算的是两个时间点之间的完整单位周期数,而不是直接对比日历上的日期:

  • 比如你当前的moment()可能是2018-04-06 15:00:00,而date2018-04-07 10:00:00,两者实际相差只有19小时,不到完整的24小时(1天),所以diff('days')会返回0。
  • 哪怕date2018-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

火山引擎 最新活动