预订系统中检测预订与30分钟时段是否重叠的技术求助
解决预订时段部分重叠的判断问题
你的核心问题是当前代码只判断了预订完全包含在时段内的情况,而忽略了所有和时段有部分重叠的场景(比如预订覆盖时段的一部分、时段被预订完全包含等)。
错误原因分析
原代码的条件:
i.StartTime.TimeOfDay >= timeslot.StartTime.TimeOfDay && i.EndTime.TimeOfDay <= timeslot.EndTime.TimeOfDay
仅筛选出完全落在目标时段内的预订,但实际需要的是只要预订和时段有任何时间重叠就标记,这两者的判断逻辑完全不同。
正确的重叠判断逻辑
两个时间区间([时段开始, 时段结束] 和 [预订开始, 预订结束])存在重叠的通用判断条件是:
预订开始时间 < 时段结束时间 并且 时段开始时间 < 预订结束时间
这个条件能覆盖所有重叠场景:
- 预订完全包含在时段内
- 时段完全包含在预订内
- 预订开始在时段内、结束在时段外
- 预订结束在时段内、开始在时段外
修改后的代码实现
var hasOverlap = bookings.Any(i => i.StartTime.TimeOfDay < timeslot.EndTime.TimeOfDay && timeslot.StartTime.TimeOfDay < i.EndTime.TimeOfDay);
如果你的时段和预订是包含完整日期的DateTime(而非仅当天的TimeOfDay),建议直接用完整的DateTime比较,避免跨天场景出错:
var hasOverlap = bookings.Any(i => i.StartTime < timeslot.EndTime && timeslot.StartTime < i.EndTime);
用Any()替代FirstOrDefault()会更高效,因为只要找到任意一个重叠的预订就会停止遍历,无需查询全部。
验证示例
比如:
- 时段:10:00-10:30,预订:10:20-10:40 → 满足条件,会被标记
- 时段:10:00-10:30,预订:09:40-10:10 → 满足条件,会被标记
- 时段:10:00-10:30,预订:09:00-11:00 → 满足条件,会被标记
- 时段:10:00-10:30,预订:11:00-11:30 → 不满足条件,不会被标记
内容的提问来源于stack exchange,提问作者Matthew Warr
相关产品推荐
相关产品推荐

