使用Moment.js计算ISO 8601时间+时长的结束时间遇问题求助
解决Moment.js的时间计算问题
你这是踩了两个Moment.js的用法小坑,我来帮你一一捋顺:
问题1:计算结果错误,返回"in 9 hours"
你用了myDate.from(dur),但from()方法的作用是计算当前时间和指定时间点的相对时间差,而且它的参数应该是一个时间对象(比如另一个moment实例),不是duration。你直接传duration的话,Moment.js会把它当成一个时间戳来解析,自然就出现了奇怪的结果。
正确的做法是用add()方法,把时长直接加到原始时间上:
let dur = moment.duration("PT3H"); let myDate = moment("2018-03-23T08:00:00Z"); let resultDate = myDate.add(dur); // 这才是正确的时间加法逻辑
问题2:转换为毫秒格式
如果要把最终的时间转换成毫秒级时间戳,直接调用moment对象的valueOf()方法就可以了:
let resultTimestamp = resultDate.valueOf(); // 输出:1521800400000(对应2018-03-23T11:00:00Z的毫秒数)
要是你想验证最终的时间字符串是否正确,还可以用format()方法输出标准的ISO 8601格式:
console.log(resultDate.format()); // 输出:2018-03-23T11:00:00Z
最后给你一份完整的规范代码(额外加了clone()避免修改原始时间对象,属于推荐的最佳实践):
// 解析时长和原始时间 let dur = moment.duration("PT3H"); let myDate = moment("2018-03-23T08:00:00Z"); // 计算时长结束后的时间(克隆原对象避免污染) let endDate = myDate.clone().add(dur); // 转换为毫秒时间戳 let endTimestamp = endDate.valueOf(); // 验证结果 console.log(endDate.format()); // 2018-03-23T11:00:00Z console.log(endTimestamp); // 1521800400000
内容的提问来源于stack exchange,提问作者Runtime Terror
相关产品推荐
相关产品推荐

