JavaScript使用moment计算两个日期时间的时分差异常问题
问题根因
你遇到的计算错误来自三个核心问题:
- 差值计算顺序颠倒:
moment.diff()方法的规则是 A.diff(B) 返回A减去B的时间差值,你用开始时间减结束时间,当结束时间晚于开始时间时,得到的差值本身就是负数 - 负数取整逻辑不符合预期:
Math.floor()对负数会向下取整,比如-0.5经Math.floor处理后会得到-1,这就是你30分钟差值得到-1小时的直接原因 - 冗余的格式转换操作:把moment对象格式化为字符串后再重新解析为moment对象属于多余操作,不仅降低性能,还可能引入格式匹配错误
修正后代码
// 直接解析为moment对象,无需转字符串再二次解析 const startShiftTime = moment(StartTime, ['DD-MM-YYYY h:mm:ss A']).utcOffset(0, false); const endShiftTime = moment(EndTime, ['DD-MM-YYYY h:mm:ss A']).utcOffset(0, false); // 用结束时间减开始时间得到正的秒数差 const totalSeconds = endShiftTime.diff(startShiftTime, 'seconds'); // 也可以直接用moment.duration处理,避免手动计算取整错误 const duration = moment.duration(totalSeconds, 'seconds'); const hours = duration.hours(); const minutes = duration.minutes(); console.log( 'startShiftTime: ', startShiftTime.format('DD-MM-YYYY hh:mm:ss A'), ' endShiftTime: ', endShiftTime.format('DD-MM-YYYY hh:mm:ss A'), ' hours: ', hours, ' minutes: ', minutes, );
特殊场景兼容
如果存在结束时间早于开始时间的跨天统计需求,可以对差值取绝对值后再处理:
const totalSeconds = Math.abs(endShiftTime.diff(startShiftTime, 'seconds'));
修正后你给出的第二条测试用例输出将为:startShiftTime: 02-12-2021 04:30:00 PM endShiftTime: 02-12-2021 05:00:00 PM hours: 0 minutes: 30,符合预期结果。
内容的提问来源于stack exchange,提问作者pratteek shaurya
相关产品推荐
相关产品推荐

