关于算法:确定两个给定的时间范围是否重叠

Determine if two given time ranges overlap

举个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
      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(a)之间的时间范围重叠。

我试图用TimeRange.getSecondOfDay()来计算这个值,如果小时是00:00:00,返回0;如果小时是23:59:59,返回86400。每天从0开始。


在一般情况下,对于给定的A,B的值有三个区域,因此无论如何,您都必须检查它们。相对简单的方法是"移动"一个范围,使其从00:00开始,如下所示:

2


首先,您需要规范化您的时间间隔:如果一个时间间隔结束到第二天,即结束时间早于开始时间,则在结束时间加上24小时。

现在您的时间间隔如下:

1
2
3
4
5
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

标准化间隔后,可以使用常规公式确定重叠:

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