datetime - 确定两个日期范围是否重叠

标签 datetime math language-agnostic

给定两个日期范围,确定两个日期范围是否重叠的最简单或最有效的方法是什么?

举个例子,假设我们有由日期时间变量 StartDate1EndDate1 StartDate2EndDate2.

最佳答案

(StartA <= EndB)和(EndA >= StartB)

证明:
令 ConditionA 表示 DateRange A 完全在 DateRange B 之后

_                        |---- DateRange A ------|
|---Date Range B -----|                          _

(如果StartA > EndB则为真)

让 ConditionB 表示 DateRange A 完全早于 DateRange B

|---- DateRange A -----|                        _ 
_                          |---Date Range B ----|

(如果EndA < StartB则为真)

如果 A 和 B 都不为真,则存在重叠 -
(如果一个范围不完全在另一个范围之后,
也不完全先于另一个, 那么它们必须重叠。)

现在是 De Morgan's laws 之一说:

Not (A Or B) <=> Not A And Not B

这意味着:(StartA <= EndB) and (EndA >= StartB)

<小时/>

注意:这包括边缘完全重叠的情况。如果您想排除它,
更改 >=运营商至> ,和<=<

<小时/>

注2。感谢@Baodad,请参阅this blog ,实际重叠最少:
{ 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)
这实际上是较长实现的语法快捷方式,其中包括额外的检查以验证开始日期是否等于或早于结束日期。从上面得出:

如果开始日期和结束日期可能无序,即,如果可能 startA > endAstartB > 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) ? StartA : StartB) <= ((EndA < EndB) ? EndA : EndB)

关于datetime - 确定两个日期范围是否重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50107071/

相关文章:

c# - 更改文件创建日期不起作用

java - 从字符串转换为日期对象不显示预期结果

C++ 将日期时间转换为时间戳

objective-c - 使用 + 或 - 运算符对两个 CGPoints 进行算术运算

c - % 和/in C 有什么区别?

linux - 如何区分同一文件的两个部分?

确定球队在联赛中最高和最低可能排名的算法

javascript - jQuery:将字符串变量传递给日期对象

math - 绘制旋转矩形

language-agnostic - 受 CPU 限制的应用程序与受 IO 限制的应用程序