Moment.js中执行时长乘除运算结果异常的修复方法
问题描述
需要对时长变量duration执行除以9后乘以10的计算,但当前newduration返回值不是正确的秒单位结果:
- 当
duration取值为299988000时,newduration仅返回311176,不符合预期。
原有问题代码:
let start = 1960 let end = 1979 let duration = moment(end.toString()).unix() - moment(start.toString()).unix(); let newduration = ((duration/9) * 10).unix(); let newvalue = moment(end.toString()).subtract(newduration, "second"); console.log(duration, newduration, newvalue);
运行依赖:
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.3/moment.min.js"></script>
错误原因
duration是两个秒级Unix时间戳相减得到的普通数值,(duration/9)*10的计算结果同样是数字类型,不是Moment实例,本身不存在.unix()方法。对普通数字调用该方法会触发JS隐式类型转换,最终输出完全错误的计算结果。
修复方案
删除newduration计算逻辑中多余的.unix()调用即可,算术计算得到的结果本身就是秒单位的合法数值,可直接传入subtract方法使用。
修复后代码:
let start = 1960 let end = 1979 let duration = moment(end.toString()).unix() - moment(start.toString()).unix(); // 移除错误的.unix()调用 let newduration = (duration / 9) * 10; let newvalue = moment(end.toString()).subtract(newduration, "second"); console.log(duration, newduration, newvalue);
- 结果验证:当
duration为299988000时,newduration正确计算值为333320000,符合秒单位预期。
内容的提问来源于stack exchange,提问作者Eby
相关产品推荐
相关产品推荐

