比较右边无限时间间隔和joda-lib

时间:2011-09-19 13:33:01

标签: java jodatime

是否有可能确定两个严格无界的区间(无限远处有一个边界的区间)重叠与否?

我试过这个(以及其他类似的变体):

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似乎不可能。我现在正在寻找替代实现。

3 个答案:

答案 0 :(得分:4)

如果两个时间间隔均为t = -∞,或两个时间间隔均为t = +∞,则无论开始日期如何,它们都会始终重叠。

如果时间间隔At = -∞开始,时间间隔Bt = +∞结束,则它们重叠 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();