jQuery日程时间冲突检测异常:误显示无关已有日程求助
修复日程冲突检测的逻辑错误
看起来你遇到的问题是日程冲突检测的逻辑过于零散,尤其是第6个条件的判断逻辑有误,导致误判了完全不重叠的时段。我们可以通过统一的重叠判断逻辑来彻底解决这个问题。
问题根源分析
你的原代码尝试用多个独立的if条件枚举所有可能的重叠场景,但这种方式不仅冗余,还容易出现逻辑漏洞。比如第6个条件使用了||(逻辑或):
if (array_time[l].start_time > timearray[m].start_time || array_time[l].end_time > timearray[m].end_time)
这个条件会触发任何“新增时段开始晚于已有时段开始”或“新增时段结束晚于已有时段结束”的情况——哪怕两个时段完全不重叠(比如8:00AM-10:00AM和1:30PM-4:00PM),这就是为什么不相关的时段被错误标记的原因。
正确的时段重叠判断逻辑
两个时间段存在重叠的核心判断逻辑非常简洁,不需要分场景枚举。假设:
- 已有时段:
existingStart(开始时间)、existingEnd(结束时间) - 新增时段:
newStart(开始时间)、newEnd(结束时间)
只要满足以下条件,就说明两个时段存在冲突:
newStart < existingEnd && newEnd > existingStart
这个条件能覆盖所有重叠场景:
- 新增时段完全覆盖已有时段
- 已有时段完全覆盖新增时段
- 两个时段部分重叠(比如已有1:00PM-3:00PM,新增1:30PM-4:00PM)
- (可选)如果你的业务认为首尾相接也算冲突(比如已有到3:00PM,新增从3:00PM开始),可以把判断改为:
newStart <= existingEnd && newEnd >= existingStart
重构后的代码
// 初始化冲突结果数组 const result_dates = []; // 遍历数据库中已有的所有日程时段 for(var m = 0; m < timearray.length; m++){ const existingStart = timearray[m].start_time; const existingEnd = timearray[m].end_time; // 遍历用户想要新增的所有日程时段 for (var l = 0; l < array_time.length; l++) { const newStart = array_time[l].start_time; const newEnd = array_time[l].end_time; // 核心冲突判断:两个时段存在重叠 if (newStart < existingEnd && newEnd > existingStart) { // 转换为12小时制时间格式 const conflictTime = `${convertTime24to12(secondsTimeSpanToHMS(existingStart))} ${convertTime24to12(secondsTimeSpanToHMS(existingEnd))}`; // 避免重复添加同一个冲突时段 if (!result_dates.includes(conflictTime)) { result_dates.push(conflictTime); console.log(`检测到冲突时段:${conflictTime}`); } } } }
代码优化点说明
- 统一逻辑:用一个条件替代多个零散的
if,逻辑更清晰,彻底避免误判 - 变量命名:明确区分已有时段和新增时段的时间变量,减少混淆
- 去重处理:添加
!result_dates.includes(conflictTime)判断,避免同一个冲突时段被多次加入结果数组
场景验证
- 对于你的测试场景:
- 已有8:00AM-10:00AM,新增1:30PM-4:00PM:
newStart(48600) < existingEnd(36000)不成立,不会被标记为冲突 - 已有1:00PM-3:00PM,新增1:30PM-4:00PM:
newStart(48600) < existingEnd(54000)且newEnd(57600) > existingStart(46800),条件成立,会被正确标记为冲突
- 已有8:00AM-10:00AM,新增1:30PM-4:00PM:
内容的提问来源于stack exchange,提问作者gourav
相关产品推荐
相关产品推荐

