课程注册系统时间冲突检测技术咨询:多时间区间处理疑问
处理多时间区间的课程冲突检测
嘿,我懂你现在的困扰——原来的校验逻辑只适配了单天单时间段的课程,现在要扩展到每周最多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
相关产品推荐
相关产品推荐

