使用moment.js计算时间戳的完整日期及分钟差时出现NaN问题
问题:使用moment.js计算时间戳时间差返回NaN的原因及解决办法
错误根源
你调用moment.unix().format()后,变量a和b变成了字符串类型,字符串之间做减法运算会直接返回NaN——因为JavaScript无法将日期字符串转换为有效的数值进行计算。format()方法的作用是将moment对象转为人类可读的字符串,并非用于时间计算的格式。
修正方案
保留moment对象(或直接获取时间戳数值)再进行计算,以下是两种可行写法:
方法1:使用moment内置的diff()方法(推荐)
diff()是moment专门用于计算时间差的方法,可直接指定输出单位:
function (val) { var a = moment.unix(val[0]) // 保留moment实例,不立即格式化 var b = moment.unix(val[1]) // 计算b与a的分钟差,Math.round处理小数 var diff = Math.round(b.diff(a, 'minutes')) // 需要显示格式化时间时再调用format console.log('A', a.format("YYYY-MM-DD hh:mm:ss")) console.log('B', b.format("YYYY-MM-DD hh:mm:ss")) console.log('difference', diff) return diff + (diff !== 1 ? ' minutes' : ' minute') }
方法2:获取毫秒级时间戳数值计算
如果习惯手动计算,可通过valueOf()获取moment对象对应的毫秒时间戳,再做减法:
function (val) { // 转成毫秒级时间戳数值 var a = moment.unix(val[0]).valueOf() var b = moment.unix(val[1]).valueOf() var diff = Math.round((b - a) / 60000) console.log('A', moment.unix(val[0]).format("YYYY-MM-DD hh:mm:ss")) console.log('B', moment.unix(val[1]).format("YYYY-MM-DD hh:mm:ss")) console.log('difference', diff) return diff + (diff !== 1 ? ' minutes' : ' minute') }
额外说明
你日志里的时间显示存在时区偏差:1672551000对应的东八区时间应为2023-01-01 17:30:00,而非05:30:00,这是moment默认时区导致的,但不影响时间差计算结果。
内容的提问来源于stack exchange,提问作者Rolanda
相关产品推荐
相关产品推荐

