2011-09-19 13 views
6

2つのリジッド・アンバウンド・インターバル(無限の1つの境界を持つインターバル)が重複しているかどうか判別できますか?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); 

しかしドキュメントによれば、2番目のパラメータとしてnullを使用する代わりに、「無限」の「今」を意味します。

EDIT:私はthis answerをメーリングリストで見つけたので、Jodaでは不可能と思われます。私は現在、代わりの実装を探しています。

+1

'' ** [半開区間](http://en.wikipedia.org/wiki/Half-open_interval#Terminology)**は、一方の境界との間隔」と同じものではありません無限に。 '' –

+0

@Mattコメントで質問を編集しました –

答えて

4

両方の間隔はt = -∞で開始する、またはその両方の間隔がt = +∞で終わるならば、彼らは関係なく、開始日の常に重複、なります。

t = +∞t = -∞の間隔A開始され、間隔B開始した場合、彼らは
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);'(BC -292,275,054)この最大日付は 'new LocalDate(292_278_993,12,31)'(AD 292,278,993年)とすることができます。これらの制限は、[joda-time GregorianChronologyクラス](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(); 
関連する問題