2011-09-19 15 views
6

¿Es posible determinar si dos intervalos no acotados (intervalos con un límite en el infinito) se superponen o no?Comparación de intervalos de tiempo sin límites con joda-lib

He intentado esto (y otras variaciones similares):

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

Pero de acuerdo con los documentos, utilizando null como segundo parámetro significa "ahora" en lugar de "infinito".

EDIT: He encontrado this answer en la lista de correo, por lo que parece ser imposible con Joda. Ahora estoy buscando implementaciones alternativas.

+1

'' A [intervalo semiabierto] ** (http://en.wikipedia.org/wiki/Half-open_interval#Terminology) ** no es el mismo que "intervalo con un límite en el infinito ". '' –

+0

He editado la pregunta con @Matt comments –

Respuesta

4

Si ambos intervalos comienzan en t = -∞, o si ambos terminan en intervalos t = +∞, lo harán siempre solapamiento, independientemente de la fecha de inicio.

Si A intervalo comienza en t = -∞ y el intervalo de B comienza en t = +∞, se superponen si y sólo si
A.start > B.start.

2

solución 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

En lugar de ahora +/- 300 años, se puede usar esta fecha mínima: 'new LocalDate (-292_275_054, 1, 1);' (año -292,275,054 BC) y esta fecha máxima se puede usar 'nueva LocalDate (292_278_993, 12, 31)' (año 292,278,993 AD). Estos límites se definen en [joda-time GregorianChronology class] (http://grepcode.com/file/repo1.maven.org/maven2/joda-time/joda-time/2.7/org/joda/time/chrono/GregorianChronology .java # GregorianChronology.0MIN_YEAR). –

1

lo recomiendo el uso de un Range<DateTime> (from Guava), que debe proporcionar todas las opciones de construcción y funciones de comparación que necesita.

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