是否有可能确定两个严格无界的区间(无限远处有一个边界的区间)重叠与否?
我试过这个(以及其他类似的变体):
Instant now = new Instant(new Date().getTime());
Interval i2 = new Interval(now, (ReadableInstant) null);
Interval i1 = new Interval(now, (ReadableInstant) null);
boolean overlapping = i2.overlaps(i1);
但根据文档,使用null
作为第二个参数意味着“现在”而不是“无限”。
编辑:我在邮件列表中找到this answer,所以Joda似乎不可能。我现在正在寻找替代实现。
答案 0 :(得分:4)
如果两个时间间隔均为t = -∞
,或两个时间间隔均为t = +∞
,则无论开始日期如何,它们都会始终重叠。
如果时间间隔A
从t = -∞
开始,时间间隔B
从t = +∞
结束,则它们重叠 iff
A.start > B.start
。
答案 1 :(得分:2)
Hacky解决方案:
/**
* Checks if two (optionally) unbounded intervals overlap each other.
* @param aBeginn
* @param aEnde
* @param bBeginn
* @param bEnde
* @return
*/
public boolean checkIfOverlap(LocalDate aBeginn,LocalDate aEnde, LocalDate bBeginn,LocalDate bEnde){
if(aBeginn == null){
//set the date to the past if null
aBeginn = LocalDate.now().minusYears(300);
}
if(aEnde == null){
aEnde = LocalDate.now().plusYears(300);
}
if(bBeginn == null){
bBeginn = LocalDate.now().minusYears(300);
}
if(bEnde == null){
bEnde = LocalDate.now().plusYears(300);
}
if(aBeginn != null && aEnde != null && bBeginn != null && bEnde != null){
Interval intervalA = new Interval(aBeginn.toDateTimeAtStartOfDay(),aEnde.toDateTimeAtStartOfDay());
Interval intervalB = new Interval(bBeginn.toDateTimeAtStartOfDay(),bEnde.toDateTimeAtStartOfDay());
if(intervalA.overlaps(intervalB)){
return true;
}
} else{
return false;
}
return false;
}
答案 2 :(得分:1)
我建议使用Range<DateTime>
(from Guava),它应该提供您需要的所有构造选项和比较功能。
Range<DateTime> r1= Range.atLeast(DateTime.now());
Range<DateTime> r2 = Range.atLeast(DateTime.now());
boolean overlap = r1.isConnected(r2) && !r1.intersection(r2).isEmpty();