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

如何计算指定时段内轨迹记录的累计跟踪分钟数

统计指定时段内的跟踪分钟数

要解决这个问题,我们需要计算轨迹数组中连续状态变更时间点之间的时间段里,落在指定时段(如09:30-18:00)的总分钟数,步骤如下:

核心思路

  1. 排序轨迹数组:确保时间点按从早到晚的顺序排列,保证连续时间区间的正确性。
  2. 拆分时间区间:遍历每一对连续的时间点,将它们的时间区间与指定时段做交集计算。
  3. 累加有效时长:把所有重叠区间的分钟数累加,得到最终结果。

代码实现

const history = [
  { entryDate: "2022-05-03T09:32:07.137+02:00", type: "statusChange", message: "" },
  { entryDate: "2022-05-02T19:32:07.137+02:00", type: "statusChange", message: "" },
  { entryDate: "2022-05-02T09:32:07.137+02:00", type: "statusChange", message: "" },
  { entryDate: "2022-05-02T07:30:01.672+02:00", type: "statusChange", message: "" }
];

// 1. 按时间升序排序轨迹数组
const sortedHistory = [...history].sort((a, b) => new Date(a.entryDate) - new Date(b.entryDate));

// 2. 定义计算重叠分钟数的辅助函数
function calculateOverlapMinutes(start, end, targetStartHour, targetStartMin, targetEndHour, targetEndMin) {
  const createTargetTime = (date, hour, min) => {
    const target = new Date(date);
    target.setHours(hour, min, 0, 0);
    return target;
  };

  let total = 0;
  const oneDayMs = 24 * 60 * 60 * 1000;
  let currentDayStart = new Date(start);
  currentDayStart.setHours(0, 0, 0, 0);

  while (start < end) {
    const dayTargetStart = createTargetTime(currentDayStart, targetStartHour, targetStartMin);
    const dayTargetEnd = createTargetTime(currentDayStart, targetEndHour, targetEndMin);
    const currentDayEnd = new Date(currentDayStart.getTime() + oneDayMs - 1); // 当天最后一刻

    // 计算当前区间与当天目标时段的交集
    const overlapStart = Math.max(start, dayTargetStart);
    const overlapEnd = Math.min(end, dayTargetEnd);

    if (overlapStart < overlapEnd) {
      total += (overlapEnd - overlapStart) / (1000 * 60); // 转换为分钟
    }

    // 处理跨天情况,移动到下一天
    start = new Date(currentDayEnd.getTime() + 1);
    currentDayStart.setTime(currentDayStart.getTime() + oneDayMs);
  }

  return total;
}

// 3. 遍历计算总有效分钟数
let totalTrackedMinutes = 0;
const targetStartHour = 9;
const targetStartMin = 30;
const targetEndHour = 18;
const targetEndMin = 0;

for (let i = 0; i < sortedHistory.length - 1; i++) {
  const currentTime = new Date(sortedHistory[i].entryDate);
  const nextTime = new Date(sortedHistory[i + 1].entryDate);
  totalTrackedMinutes += calculateOverlapMinutes(currentTime, nextTime, targetStartHour, targetStartMin, targetEndHour, targetEndMin);
}

console.log(`指定时段内的跟踪总分钟数:${totalTrackedMinutes.toFixed(2)}`);

关键细节说明

  • 时区处理:代码会自动识别entryDate中的时区偏移(如+02:00),确保目标时段的时间计算与轨迹时间保持一致。
  • 跨天场景:辅助函数会自动拆分跨天的时间区间,分别计算每一天与目标时段的重叠部分,避免遗漏。
  • 精度控制:最终结果保留两位小数,可根据需求调整toFixed的参数。

内容的提问来源于stack exchange,提问作者Sebastian Lagua

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 10:40:26