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

给出以下示例:

      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)之间,则时间范围从18:00至04:00(A)在02:00至04:00之间重叠。

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


在一般情况下,对于给定的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);
}

首先,你需要规范你的时间间隔:如果一个时间间隔换到第二天,即结束时间在开始时间之前,那么在结束时间增加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) {
    ...
}
链接地址: http://www.djcxy.com/p/54411.html

上一篇: Determine if two given time ranges overlap

下一篇: Algorithm to detect overlapping periods