首页 > 文章列表 > 如何计算预定时间段内已安排时间段的长度?

如何计算预定时间段内已安排时间段的长度?

203 2025-04-08

如何计算预定时间段内已安排时间段的长度?

算法:计算预定时间段内已安排时间段的总时长

给定两个数组 paiban (预定时间段) 和 paiban2 (已安排时间段),目标是计算 paiban2 中,落在 paiban 各个时间段内的已安排时间段的总时长。

改进的解决方案:

之前的方案只计算了满足条件的已安排时间段的数量,而非时长。 我们需要修改算法来计算时长。 假设时间以分钟为单位。

function calculateScheduledTime(paiban, paiban2) {
  const results = paiban.map(item => {
    let totalTime = 0;
    const filtered = paiban2.filter(({ starttime, endtime }) => {
      // 转换为分钟数方便计算
      const itemStartMinutes = timeToMinutes(item.starttime);
      const itemEndMinutes = timeToMinutes(item.endtime);
      const startMinutes = timeToMinutes(starttime);
      const endMinutes = timeToMinutes(endtime);

      // 检查已安排时间段是否完全在预定时间段内
      return itemStartMinutes <= startMinutes && itemEndMinutes >= endMinutes;
    });

    filtered.forEach(({ starttime, endtime }) => {
      totalTime += timeToMinutes(endtime) - timeToMinutes(starttime);
    });
    return totalTime;
  });
  return results;
}

function timeToMinutes(time) {
  const [hours, minutes] = time.split(':').map(Number);
  return hours * 60 + minutes;
}


const paiban = [
  { id: 1, starttime: '08:00', mouth: 10, endtime: '09:00', checked: false },
  { id: 2, starttime: '09:00', mouth: 10, endtime: '10:00', checked: false },
  { id: 3, starttime: '10:00', mouth: 10, endtime: '11:00', checked: false },
];

const paiban2 = [
  { id: 1, starttime: '08:00', endtime: '08:10' },
  { id: 2, starttime: '08:10', endtime: '08:20' },
  { id: 3, starttime: '08:30', endtime: '08:50' },
  { id: 4, starttime: '09:00', endtime: '09:10' },
  { id: 5, starttime: '09:10', endtime: '09:20' },
  { id: 6, starttime: '10:00', endtime: '10:10' },
  { id: 7, starttime: '10:10', endtime: '10:20' },
  { id: 8, starttime: '10:20', endtime: '10:40' },
];

console.log(calculateScheduledTime(paiban, paiban2)); // [30, 20, 40]  (in minutes)

这个改进后的代码首先定义了一个 timeToMinutes 函数将时间字符串转换为分钟数,然后在 calculateScheduledTime 函数中计算每个预定时间段内已安排时间段的总时长(以分钟为单位)。 输出结果更直观地反映了已安排时间的实际时长。 注意,这个算法假设已安排的时间段不会超过预定时间段。 如果需要处理这种情况,需要添加额外的逻辑。

来源:1740063482