如何在day.js中比较两个时间?解决时间差计算返回NaN的问题
时间差计算返回NaN的核心原因
你的代码存在两个直接触发NaN的问题:
diff方法仅支持接收dayjs实例、原生Date对象、时间戳三类可计算的时间结构,不支持格式化后的纯时间字符串。你把dayjs().format("HH:mm:ss")返回的字符串直接传给diff方法,内部无法完成解析计算,就会返回NaN。HH:mm:ss格式的纯时间字符串不属于dayjs原生支持的直接解析格式,你把这类字符串直接传入dayjs(),会生成无效的Date对象,进一步导致计算结果失效。
你原来的日期计算逻辑没出问题,是因为YYYY/MM/DD刚好是dayjs原生可直接解析的字符串格式,适配了你的传参写法,但这种写法本身健壮性不足,遇到非原生支持的格式就会触发和时间计算一样的报错。
修复方案
- 引入并注册dayjs的自定义格式解析插件,否则无法手动指定规则解析对应格式的时间字符串。
- 所有参与差值计算的时间值,都要转为合法的dayjs实例,禁止把格式化后的字符串直接作为diff方法的入参。
首先完成插件注册(以前端ESM项目为例):
import dayjs from 'dayjs' import customParseFormat from 'dayjs/plugin/customParseFormat' // 注册插件,开启自定义格式解析能力 dayjs.extend(customParseFormat)
修复后的时间差计算代码:
// 严格按照HH:mm:ss格式解析创建时间,第三个参数开启严格匹配模式,避免解析偏差 const createTime = dayjs(Post.createdOn.time, 'HH:mm:ss', true) // 直接获取当前时刻的dayjs实例,不需要提前做格式化 const requestTime = dayjs() // 计算两个时间的分钟级差值 const timeDiff = createTime.diff(requestTime, 'minute') console.log(`timeDiff: ${timeDiff}`)
注意:dayjs解析纯时间字符串时,会自动将其绑定为当日日期的对应时刻,和当前时刻的计算基准天然对齐,非跨天场景下的纯时间差计算结果是准确的。如果需要计算跨天的纯时间差值(比如对比23:50和00:10的差),需要手动增加跨天偏移的判断逻辑,不能直接调用diff计算。
原有日期计算逻辑也可以同步优化得更健壮:统一按指定格式严格解析入参,取当日零点的dayjs实例作为对比基准,避免边界值的计算偏差。
内容的提问来源于stack exchange,提问作者user597916
相关产品推荐
相关产品推荐

