给出以下示例:
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开始。
答案 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) {
...
}