如何用C#实现预约时间与假期时段的冲突校验?
C# 预约与假期时段重叠校验的正确实现方案
核心重叠判断逻辑
要判断预约时段与假期时段是否重叠,核心逻辑是:两个时间段只要不是完全错开,就属于重叠。
对于两个时间段 [aptStart, aptEnd] 和 [holidayStart, holidayEnd],唯一的两种不重叠情况是:
- 预约完全在假期结束之后:
aptStart >= holidayEnd - 预约完全在假期开始之前:
aptEnd <= holidayStart
反过来,只要不满足上述任意一种情况,两个时段就存在重叠。
修正后的代码实现
假设我们定义如下假期数据模型:
public class Holiday { public DateTime StartTime { get; set; } public DateTime EndTime { get; set; } }
下面是修正后的CheckDoctorAvailability方法,遍历所有假期记录并校验重叠情况:
public bool CheckDoctorAvailability(DateTime aptStartDate, DateTime aptEndDate, List<Holiday> holidays) { foreach (var holiday in holidays) { // 反向判断:只要不是完全错开,就是重叠 bool isOverlapping = !(aptStartDate >= holiday.EndTime || aptEndDate <= holiday.StartTime); if (isOverlapping) { // 存在重叠,返回不可用 return false; } } // 无重叠,返回可用 return true; }
针对测试场景的验证
你的测试场景:
- 预约时段:
2022-11-10 12:41:00至2022-11-10 15:41:00 - 11月10日假期时段:
2022-11-10 12:00:00至2022-11-10 13:00:00
代入逻辑判断:
aptStartDate (12:41) >= holiday.EndTime (13:00)→ falseaptEndDate (15:41) <= holiday.StartTime (12:00)→ false- 因此
isOverlapping = !false→ true,方法返回false,符合预期(无法创建预约)
常见错误逻辑分析
很多开发者容易写出不完整的判断,比如仅检查:
- 预约开始时间在假期范围内
- 或者预约结束时间在假期范围内
这种写法会漏掉预约时段完全包含假期、假期完全包含预约的场景,而反向判断逻辑可以覆盖所有重叠情况。
内容的提问来源于stack exchange,提问作者Fatt Sky
相关产品推荐
相关产品推荐

