给定两个日期范围,确定两个日期范围是否重叠的最简单或最有效的方法是什么?
例如,假设我们有DateTime变量StartDate1
toEndDate1
和 StartDate2
to表示的范围EndDate2
。
(StartA <= EndB)和(EndA> = StartB)
证明:
让ConditionA表示DateRange A完全在DateRange B之后
_ |---- DateRange A ------| |---Date Range B -----| _
(如果为,则为True StartA > EndB
)
让ConditionB表示DateRange A完全在DateRange B之前
|---- DateRange A -----| _ _ |---Date Range B ----|
(如果为,则为True EndA < StartB
)
如果A或B都不为真,则存在重叠-
(如果一个范围既不完全在另一个范围之后,
也不完全在另一个范围之前,则它们必须重叠。)
现在,De Morgan的法律之一说:
Not (A Or B)
<=> Not A And Not B
转换为: (StartA <= EndB) and (EndA >= StartB)
注意:这包括边缘完全重叠的条件。如果您希望排除该错误,
请将>=
运算符更改为>
,并将<=
其更改为<
笔记2。由于@Baodad,看到这个博客,实际的重叠是至少:
{ endA-startA
,endA - startB
,endB-startA
,endB - startB
}
(StartA <= EndB) and (EndA >= StartB)
(StartA <= EndB) and (StartB <= EndA)
注意3。感谢@tomosius,一个较短的版本显示为:
DateRangesOverlap = max(start1, start2) < min(end1, end2)
这实际上是较长实现的语法快捷方式,其中包括额外的检查以验证开始日期在endDates或之前。从上面导出:
如果开始日期和结束日期可能不正确,即如果startA > endA
或startB > endB
,则还必须检查它们的顺序是否正确,这意味着您必须添加两个其他有效性规则:
(StartA <= EndB) and (StartB <= EndA) and (StartA <= EndA) and (StartB <= EndB)
或:
(StartA <= EndB) and (StartA <= EndA) and (StartB <= EndA) and (StartB <= EndB)
或,
(StartA <= Min(EndA, EndB) and (StartB <= Min(EndA, EndB))
或:
(Max(StartA, StartB) <= Min(EndA, EndB)
但是要实现Min()
和Max()
,您必须进行编码(使用C三元表示简洁):
(StartA > StartB? Start A: StartB) <= (EndA < EndB? EndA: EndB)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句