2011-09-19 3 views
6

E 'possibile determinare wether due intervalli rigth-illimitati (intervalli con un confine all'infinito) si sovrappongono o no?Confronto intervalli di tempo destro illimitate con Joda-lib

Ho provato questo (e altre varianti simili):

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

Ma secondo la documentazione, utilizzando null come secondo parametro significa "ora" invece di "infinito".

EDIT: ho trovato this answer nella mailing list, quindi sembra impossibile con Joda. Ora sto cercando implementazioni alternative.

+1

'' A ** [intervallo semiaperto] (http://en.wikipedia.org/wiki/Half-open_interval#Terminology) ** non è la stessa cosa di "intervallo con un confine all'infinito. " ''

+0

Ho modificato la domanda con @ Matt commenta –

risposta

4

Se entrambi gli intervalli partono da t = -∞, o se entrambi gli intervalli finiscono alle t = +∞, saranno sempre sovrapposizione, indipendentemente dalla data di inizio.

Se intervallo A parte da t = -∞ e intervallo B parte da t = +∞, si sovrappongono sse
A.start > B.start.

2

soluzione 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

Invece di ora +/- 300 anni, questa data minimo può essere utilizzato: 'nuova LocalDate (-292_275_054, 1, 1);' (anno -292.275.054 aC) e questa data massima può essere usata per 'new LocalDate (292_278_993, 12, 31)' (anno 292.278.993 AD). Tali limiti sono definiti in [classe GregorianChronology Joda-tempo] (http://grepcode.com/file/repo1.maven.org/maven2/joda-time/joda-time/2.7/org/joda/time/chrono/GregorianChronology .java # GregorianChronology.0MIN_YEAR). –

1

Mi consiglia di utilizzare un Range<DateTime> (from Guava), che dovrebbe fornire tutte le opzioni di costruzione e funzioni di confronto è necessario.

Range<DateTime> r1= Range.atLeast(DateTime.now()); 
Range<DateTime> r2 = Range.atLeast(DateTime.now()); 
boolean overlap = r1.isConnected(r2) && !r1.intersection(r2).isEmpty();