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

预订系统中检测预订与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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 03:27:07