在排班系统、睡眠记录或定时任务中,经常会遇到开始时间在某天晚上、结束时间在下一天凌晨的情况。使用 Day.js 可以非常简洁地计算出这种跨越午夜的时间间隔,而不必关心日期是否变更。

基本计算思路
Day.js 的 diff 方法能够直接比较两个时间点,并返回指定单位的差值。只要把开始和结束都当成独立的时间点传入,即使跨天也能算出正确毫秒数或小时数。
创建时间对象
我们可以用 dayjs 分别解析带有日期的开始和结束字符串,或者使用 add 方法构造次日时间。
示例代码
下面示例演示从今晚 23:30 到明早 07:15 的间隔计算:
// 引入 dayjs
import dayjs from 'dayjs';
// 假设开始时间是今天 23:30
const start = dayjs('2024-03-01 23:30:00');
// 结束时间是次日 07:15
const end = start.add(1, 'day').hour(7).minute(15).second(0);
// 计算分钟差
const diffMinutes = end.diff(start, 'minute');
// 计算小时差(带小数)
const diffHours = end.diff(start, 'hour', true);
console.log('间隔分钟数:', diffMinutes);
console.log('间隔小时数:', diffHours);
使用字符串直接解析
如果后端已经返回了完整时间戳,直接解析更直观:
import dayjs from 'dayjs';
const start = dayjs('2024-03-01 23:30:00');
const end = dayjs('2024-03-02 07:15:00');
const minutes = end.diff(start, 'minute');
console.log(minutes); // 465
注意事项
- 确保开始和结束使用同一时区,否则跨时区会偏移。
- 若只传时间不带日期,Day.js 会默认取当天,可能导致负差值。
- 用
diff的第三个参数 true 可获取浮点结果,方便做精确展示。
小结
借助 Day.js 的不可变对象和 diff 方法,跨越午夜的时间间隔计算只需几行代码。核心是把起止时间都当作绝对时间点处理,不用手动判断日期进退。