C#中如何比较两个Period对象的日期 判断新时段是否无重叠可新增
时间段不重叠判断方案
首先基于你定义的Period类:
class Period { public DateTime Start { get; set; } public DateTime End { get; set; } }
核心判断逻辑
判断两个时段无重叠等价于新时段完全落在已有时段的左侧,或者完全落在已有时段的右侧,对应的布尔表达式为:
// 无重叠返回true,有重叠返回false bool IsNotOverlap(Period existing, Period newPeriod) { // 新时段完全在已有时段之前 或 完全在已有时段之后 return newPeriod.End <= existing.Start || newPeriod.Start >= existing.End; }
注:如果你的业务定义中「前一个时段的结束日和后一个时段的开始日为同一天」算重叠,只需要把上面的
<=改成<、>=改成>即可。
逻辑验证
我们用你给出的已有时段(2022-12-18 至 2023-01-11)作为existing参数,逐一验证测试场景:
- 新时段2022-12-19 至 2023-01-10:既不满足End<=2022-12-18,也不满足Start>=2023-01-11,返回false(不可新增,符合预期)
- 新时段2022-12-19 至 2023-01-12:同上,返回false(不可新增,符合预期)
- 新时段2022-12-17 至 2023-01-12:同上,返回false(不可新增,符合预期)
- 新时段2022-12-16 至 2022-12-17:满足End<=2022-12-18,返回true(可新增,符合预期)
等价写法
你也可以用反逻辑先判断重叠,再取反得到无重叠的结果,两种写法完全等价:
bool IsOverlap(Period existing, Period newPeriod) { return newPeriod.Start < existing.End && newPeriod.End > existing.Start; } // 无重叠允许新增的判断 bool allowAdd = !IsOverlap(periodInDb, newPeriod);
内容的提问来源于stack exchange,提问作者lunisolar
相关产品推荐
相关产品推荐

