使用MomentJS计算旅程时长时如何正确计入暂停时间避免数值跳变
问题根因
你的逻辑存在两个核心疏漏:
- 未累计历史暂停总时长,仅记录了单次暂停的时间点,且恢复操作的状态没有正确处理
当你点击恢复旅程时,必然会清空pauseTime字段,此时逻辑直接回到用原始Journey.startTime计算总时长的分支,中间暂停的所有时间会被直接算入有效时长,自然出现跳变。 - 暂停状态下的计算逻辑存在冗余无效代码
moment(Journey.startTime).add(Journey.pauseTime - Journey.startTime, 'ms').toDate()的计算结果等价于Journey.pauseTime本身,这层转换没有实际意义。
修复方案
新增totalPauseDuration字段用来累计所有历史暂停的总时长,操作和计算逻辑调整如下:
- 暂停操作触发时:仅记录当前时间到
Journey.pauseTime - 恢复操作触发时:计算本次暂停的时长
当前时间 - Journey.pauseTime,将该值累加到Journey.totalPauseDuration后清空Journey.pauseTime - 统一时长计算逻辑:
const totalElapsed = moment().diff(Journey.startTime); const pauseOffset = Journey.totalPauseDuration + (Journey.pauseTime ? moment().diff(Journey.pauseTime) : 0); const duration = moment.duration(totalElapsed - pauseOffset);
效果验证
调整后可以覆盖所有场景:
- 暂停状态下时长会固定在暂停时刻的数值,不会继续增长
- 恢复后时长从暂停前的数值继续累加,不会出现跳变
- 多次暂停恢复、超长时间暂停后恢复都不会出现差值错误
内容的提问来源于stack exchange,提问作者Cameron
相关产品推荐
相关产品推荐

