如何计算指定时段内轨迹记录的累计跟踪分钟数
统计指定时段内的跟踪分钟数
要解决这个问题,我们需要计算轨迹数组中连续状态变更时间点之间的时间段里,落在指定时段(如09:30-18:00)的总分钟数,步骤如下:
核心思路
- 排序轨迹数组:确保时间点按从早到晚的顺序排列,保证连续时间区间的正确性。
- 拆分时间区间:遍历每一对连续的时间点,将它们的时间区间与指定时段做交集计算。
- 累加有效时长:把所有重叠区间的分钟数累加,得到最终结果。
代码实现
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
相关产品推荐
相关产品推荐

