如果我有两个时间段,我怎么知道它们是否重叠?

时间:2010-08-06 02:03:34

标签: c# .net-3.5 date-range

  

可能重复:
  Determine Whether Two Date Ranges Overlap

假设我有两个对象,并且每个对象的日期范围都在其结束日期和开始日期之间,如何以最有效或最快的方式确定两个日期范围之间是否有任何重叠

我想使用.NET 3.5 c#

执行此操作

2 个答案:

答案 0 :(得分:1)

这是最有效还是最快,我不确定,但这就是我要做的。如果它被证明是一个瓶颈,那么我才会进一步优化:

如果需要,您可以通过交换范围来确保第一个范围更早(或同时)开始。

然后,如果其他范围开始小于或等于第一个范围结束(如果范围包含,包含开始和结束时间)或小于(如果范围包括开始和排除),则可以检测重叠结束)。

假设两端都是包容性的,那么只有四种可能性,其中一种是不重叠的:

|----------------------|        range 1
|--->                           range 2 overlap
 |--->                          range 2 overlap
                       |--->    range 2 overlap
                        |--->   range 2 no overlap

范围2的端点不会进入。所以,在伪代码中:

def doesOverlap (r1,r2):
    if r1.s > r2.s:
        swap r1, r2
    if r2.s > r1.e:
        return false
    return true

如果范围在开头是包含的,而在结尾是独占的,则只需在第二个>语句中将>=替换为if

|----------------------|        range 1
|--->                           range 2 overlap
 |--->                          range 2 overlap
                       |--->    range 2 no overlap
                        |--->   range 2 no overlap

您极大地限制了必须进行的检查次数,因为通过确保范围1在范围2之后永远不会开始,您可以提前删除一半的问题空间。

答案 1 :(得分:-4)

检查第二个对象的Startdate或Enddate是否在第一个对象的范围内:

bool overlap = (y.Start > x.Start && y.Start < x.End) || (y.End > x.Start && y.End < x.End);