如何在Moment.js中完全忽略日期,仅计算时间差?
仅计算Moment时间对象的时间部分差值(忽略日期)
问题场景
你有两个包含日期和时间的Moment对象,仅需计算时间部分的小时差(忽略日期跨度),但直接调用diff方法会返回包含日期的总小时数,结果不符合预期:
var startTime = moment('02-01-2021 13:01:01'); {/* Mon Feb 01 2021 13:01:01 GMT+0100 */} var endTime = moment('02-01-2022 17:01:01'); {/* Tue Feb 01 2022 17:01:01 GMT+0100 */} // 输出8764(包含一整年的小时数),而非预期的4 console.log(endTime.diff(startTime, 'hours'));
解决方案
以下几种方法可实现仅计算时间部分的差值:
方法1:统一日期后计算差值
将两个时间的日期设置为同一天,再调用diff方法:
var startTime = moment('02-01-2021 13:01:01'); var endTime = moment('02-01-2022 17:01:01'); // 克隆startTime,替换为endTime的时间部分 var adjustedEndTime = startTime.clone() .hours(endTime.hours()) .minutes(endTime.minutes()) .seconds(endTime.seconds()); var hourDiff = adjustedEndTime.diff(startTime, 'hours'); console.log(hourDiff); // 输出4
方法2:直接计算时间戳差值
提取时、分、秒转换为总秒数,计算差值后转小时:
var startTime = moment('02-01-2021 13:01:01'); var endTime = moment('02-01-2022 17:01:01'); // 计算时间部分的总秒数 const getTotalSeconds = (m) => m.hour() * 3600 + m.minute() * 60 + m.second(); var startSec = getTotalSeconds(startTime); var endSec = getTotalSeconds(endTime); // 转换为小时(取整数部分) var hourDiff = Math.floor((endSec - startSec) / 3600); console.log(hourDiff); // 输出4
注意事项
如果结束时间的时间部分早于开始时间(如start为17:00,end为13:00),上述方法会返回负数,可根据需求使用Math.abs()获取绝对值。
内容的提问来源于stack exchange,提问作者Ernest Smotlak
相关产品推荐
相关产品推荐

