2012-01-11 16 views
8

Tengo algunos datos sobre los horarios de apertura que intento representar usando Joda-Time.¿Cómo puedo expresar los intervalos parciales usando Joda-Time?

El horario de apertura típicos de mirada día como este:

Abierto de 9 a 12, y del 13 al 20.

La razón principal para representarlos en entidades Joda-Time, es validarlos:

  • Comprobar que las horas de apertura son válidos (9 es antes de las 12, etc)
  • Compruebe que no hay intervalos abiertos se superponen ("9-12 y 11-13" son ilegales)

API-sabio, el tiempo Joda Interval clase tiene los métodos que necesito para hacer esta validación, pero los intervalos son pares de instantes en la fecha-hora-continuo. Me gustaría representarlos independientemente del tiempo absoluto, como un intervalo de dos parciales de LocalTime. es posible?

+2

Creo que ya ha proporcionado el mejor tipo de respuesta. Lo implementaría como OpenTimeRange con un principio y un final 'LocalTime' y luego tendría una matriz para especificar las horas de apertura de un día. – Gray

Respuesta

5

He aquí un intento de TimeInterval personalizado (más o menos como la solución gris comentó):

 
import org.joda.time.*; 

public class TimeInterval { 
    private static final Instant CONSTANT = new Instant(0); 
    private final LocalTime from; 
    private final LocalTime to; 

    public TimeInterval(LocalTime from, LocalTime to) { 
     this.from = from; 
     this.to = to; 
    } 

    public boolean isValid() { 
     try { return toInterval() != null; } 
     catch (IllegalArgumentException e) { return false;} 
    } 

    public boolean overlapsWith(TimeInterval timeInterval) { 
     return this.toInterval().overlaps(timeInterval.toInterval()); 
    } 

    /** 
    * @return this represented as a proper Interval 
    * @throws IllegalArgumentException if invalid (to is before from) 
    */ 
    private Interval toInterval() throws IllegalArgumentException { 
     return new Interval(from.toDateTime(CONSTANT), to.toDateTime(CONSTANT)); 
    } 
} 
+3

Sí, necesita escribir este tipo de clase de intervalo usted mismo. Por cierto, su método toInterval() está roto, porque obtiene el instante actual dos veces (una vez cada ToDateTimeToday). Podría devolver dos fechas diferentes si se llama exactamente a cada lado de la medianoche (una condición de carrera). – JodaStephen

+0

Gracias por la revisión, Stephen. Actualicé el código para evaluar siempre el intervalo en una fecha constante. –

Cuestiones relacionadas