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

问题描述 投票:6回答:3

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

我试过这个(和其他类似的变化):

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

java jodatime
3个回答
4
投票

如果两个区间都从t = -∞开始,或者两个区间都以t = +∞结束,则无论开始日期如何,它们将始终重叠。

如果区间At = -∞开始并且区间Bt = +∞结束,则它们重叠iff A.start > B.start


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;
}

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();
© www.soinside.com 2019 - 2024. All rights reserved.