You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 13:45:29