2011-09-19 29 views
6

是否有可能確定是否有兩個rig-unbounded時間間隔(在無窮遠時有一個邊界的時間間隔)是否重疊?將右無限時間間隔與joda-lib進行比較

我試圖此(和其它類似的變型):

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似乎不可能。我現在正在尋找替代實現。

+1

'' A ** [半開區間(http://en.wikipedia.org/wiki/Half-open_interval#Terminology)**是不一樣的東西爲「具有一個邊界間隔在無窮遠處「。 '' –

+0

我已經用@Matt評論編輯了這個問題 –

回答

4

如果兩個間隔在t = -∞啓動,或者兩者間隔結束在t = +∞,他們將總是重疊,無論開始日期。

如果在t = -∞間隔A啓動和間隔B開始於t = +∞,它們重疊IFF
A.start > B.start

2

哈克解決方案:

/** 
* 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

現在可以使用這個最小日期來代替現在的+/- 300年:'new LocalDate(-292_275_054,1,1);'(-292,275,054 BC)並且這個最大日期可以使用'新的LocalDate(292_278_993,12,31)'(公元292,278,993年)。這些限制在[約達時間格里高利時間學類]中定義(http://grepcode.com/file/repo1.maven.org/maven2/joda-time/joda-time/2.7/org/joda/time/chrono/GregorianChronology的.java#GregorianChronology.0MIN_YEAR)。 –

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(); 
相關問題