确定两个给定的时间范围是否重叠

时间:2015-11-12 16:17:23

标签: algorithm datetime

给出以下示例:

      0  2  4  6  8  10 12 14 16 18 20 22 24
Hour: |--|--|--|--|--|--|--|--|--|--|--|--|

A:    ------|                    |---------
B:       |-----------|
C:    ---|                    |------------
D:    |--------|
E:                                  |-----|

A(from 18:00 to 04:00) 
B(from 02:00 to 10:00) 
C(from 16:00 to 02:00)
D(from 00:00 to 06:00)
E(from 20:00 to 00:00)

确定两个给定时间范围是否重叠的最有效方法是什么?

请注意,如果时间范围在02:00到10:00(B)之间,则它将在02:00到04:00之间的18:00到04:00(A)的时间范围内重叠。

我正在尝试使用TimeRange.getSecondOfDay()来计算,如果小时为00:00:00则返回0,如果小时为23:59:59则返回86400。每天从0开始。

2 个答案:

答案 0 :(得分:2)

一般情况下,对于给定的A,有三个B值区域,所以不管怎样,你必须全部检查它们。相对简单的方法是“移动”一个范围,使其从00:00开始,如下所示:

bool Overlap(Range a, Range b){
  time b_from = (b.from-a.from+86400)%86400;
  time b_to = (b.to-a.from+86400)%86400;
  time a_to = (a.to-a.from+86400)%86400;

  return !(b_from<=b_to && b_from>=a_to);
}

答案 1 :(得分:1)

首先,您需要规范化您的间隔:如果间隔包裹到第二天,即结束时间在开始时间之前,则在结束时间添加24小时。

现在你的间隔看起来像这样:

A(from 18:00 to 28:00) 
B(from 02:00 to 10:00) 
C(from 16:00 to 26:00)
D(from 00:00 to 06:00)
E(from 20:00 to 00:00)

如果您使用TimeRange.getSecondOfDay(),则需要添加相应的秒数,即24*60*60*60

一旦区间标准化,您可以使用通常的公式来确定重叠:

int overlap = MIN(a.end, b.end) - MAX(a.begin, b.begin);
if (overlap > 0) {
    ...
}