Moment.js执行时间减法报非有效ISO-8601日期格式如何解决
问题根因
你的代码存在4个明确问题,直接导致报错和计算失败:
- 基础语法错误:
let newvalue = = moment(...)行多写了一个等号,不符合JS语法规则。 - 触发ISO格式报错的核心原因:
duration是两个unix时间戳相减得到的秒级差值,本质是整数,你把这个整数转成字符串后直接传入moment(),moment默认会按ISO-8601日期字符串格式解析,纯数字字符串完全不符合ISO日期规范,必然抛出格式错误。 - 计算逻辑错误:unix时间戳的差值是纯数值,不需要再转成moment对象调用
.unix()方法,直接做数值算术运算即可;另外你原代码计算duration时顺序写反,得到的是负的时长值。 - 解析不严谨:直接传入
"1977"、"1985"这种纯数字字符串给moment,没有指定解析格式,很容易出现解析结果和预期不一致的问题。
正确实现代码
最终输出可直接得到符合ISO-8601规范的结果,代码如下:
let start = 1977 let end = 1985 // 明确指定按年份格式解析输入值,得到对应的秒级unix时间戳 const startTimestamp = moment(start.toString(), 'YYYY').unix() const endTimestamp = moment(end.toString(), 'YYYY').unix() // 计算两个时间的秒级差值(注意顺序:晚的时间减早的时间得到正时长) const duration = endTimestamp - startTimestamp // 时长是秒级数值,直接做减法即可,不需要传入moment解析 const newResultTimestamp = endTimestamp - duration // 用moment.unix解析秒级时间戳,最后转成ISO-8601格式输出 const newvalue = moment.unix(newResultTimestamp).toISOString()
关键注意点
所有秒级unix时间戳、两个时间的秒/毫秒差值都是纯数值,直接做算术运算即可,不要把这类纯数字转成字符串后直接传入
moment()解析。如果要把秒级unix时间戳转成moment对象,必须使用moment.unix(时间戳)的写法,否则会触发格式校验错误。
内容的提问来源于stack exchange,提问作者Eby
相关产品推荐
相关产品推荐

