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

课程注册系统时间冲突检测技术咨询:多时间区间处理疑问

处理多时间区间的课程冲突检测

嘿,我懂你现在的困扰——原来的校验逻辑只适配了单天单时间段的课程,现在要扩展到每周最多2天、每天对应一个独立时间段的场景对吧?其实核心逻辑很好梳理:把每个时间段拆出来单独做冲突检查,只要有任意一个时间段和已选课程的时间段重叠,就判定整体冲突。

下面给你具体的实现思路和代码示例:

1. 先解析多时间段的课程数据

假设你的课程对象现在是这种格式(和你给出的示例对应):

// 新待注册课程:每周2个独立时间段
const newCourse = {
  courseId: "00002",
  days: "周一-周二", // 用'-'分隔多天,顺序和hours对应
  hours: "10:00-11:40*14:00-15:40" // 用'*'分隔对应每天的时间段
};

第一步要把days和hours拆分成一一对应的时间段数组:

// 拆分多天与对应时间段
const dayList = newCourse.days.split("-");
const hourList = newCourse.hours.split("*");

// 组合成结构化的时间段数组,方便后续遍历
const newCourseTimeSlots = dayList.map((day, index) => ({
  day,
  timeRange: hourList[index]
}));
// 结果:[{day: '周一', timeRange: '10:00-11:40'}, {day: '周二', timeRange: '14:00-15:40'}]

2. 封装时间重叠判断工具函数

先把单个时间段的冲突判断逻辑抽成工具函数,方便复用:

// 判断两个时间区间是否重叠(输入格式为'HH:mm-HH:mm')
function isTimeRangeOverlap(rangeA, rangeB) {
  // 将时间字符串转换为当日总分钟数,方便数值比较
  const convertToMinutes = (timeStr) => {
    const [hour, minute] = timeStr.split(":").map(Number);
    return hour * 60 + minute;
  };

  const [startA, endA] = rangeA.split("-").map(convertToMinutes);
  const [startB, endB] = rangeB.split("-").map(convertToMinutes);

  // 重叠判断规则:A的开始在B结束前,且A的结束在B开始后
  return startA < endB && endA > startB;
}

3. 遍历所有时间段做冲突校验

接下来,把已选课程也拆成时间段数组,然后和新课程的所有时间段逐一比对:

// 判断单门已选课程与新课程是否存在冲突
function isSingleCourseConflict(existingCourse, newCourseSlots) {
  // 先拆分已选课程的时间段
  const existingDayList = existingCourse.days.split("-");
  const existingHourList = existingCourse.hours.split("*");
  const existingTimeSlots = existingDayList.map((day, index) => ({
    day,
    timeRange: existingHourList[index]
  }));

  // 遍历所有时间段组合,只要有一组冲突就返回true
  for (const newSlot of newCourseSlots) {
    for (const existingSlot of existingTimeSlots) {
      // 同一天才需要判断时间重叠
      if (newSlot.day === existingSlot.day && isTimeRangeOverlap(newSlot.timeRange, existingSlot.timeRange)) {
        return true;
      }
    }
  }
  return false;
}

4. 批量校验所有已选课程

最后,遍历学生的已选课程列表,只要有一门课程冲突,就提示无法注册:

// 假设学生已选课程列表
const enrolledCourses = [
  {
    courseId: "00001",
    days: "周一-周二",
    hours: "11:40-12:30*13:40-15:30"
  }
];

// 检查新课程是否与已选课程冲突
const hasConflict = enrolledCourses.some(course => isSingleCourseConflict(course, newCourseTimeSlots));

if (hasConflict) {
  console.log("抱歉,该课程与你已选的课程存在时间冲突!");
} else {
  console.log("可以正常注册该课程~");
}

额外优化建议

  • 先做参数合法性校验:如果拆分后的dayList和hourList长度不一致,直接抛出参数错误,避免匹配混乱
  • 如果后续支持每周更多天数,这个逻辑可以直接复用,不需要大改
  • 可以把时间段的分钟数解析结果缓存起来,避免重复计算,提升性能

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:57:48