确定两个给定的时间范围是否重叠
给出以下示例:
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