2010-12-08 22 views
28

Joda-time tiene una clase Interval, que es un rango entre DateTime s. ¿Qué se puede utilizar para un rango de LocalDate s?Intervalo de hora local en Joda-time

Quiero un objeto que represente, por ejemplo, "del 1/1/2011 al 10/1/2011", sin la hora (o zonas horarias) que alguna vez haya entrado en la imagen.

Por lo que veo, joda-time no tiene nada incorporado para eso. Si no existe nada para él, y lo creamos, ¿qué aspecto debería tener? Lo que es más importante, ¿qué interfaces de joda-time podría implementar para integrarse mejor en los otros tipos, manteniéndose consistente con el diseño joda-time? ¿Tendría sentido implementar ReadableInterval, donde getStart y getEnd devuelven DateMidnight?

Respuesta

14

La clase Interval representa un intervalo de tiempo de un instante de milisegundos a otro instante (completo con la zona horaria). DateMidnight es un instante. Entonces su implementación propuesta de un intervalo para DateMidnights ya está lista allí.

Interval i = new Interval(
    new DateMidnight(2010, 3, 2), new DateMidnight(2010, 3, 5)); 

i.contains(new DateTime(2010, 3, 1, 23, 59, 59, 999)); // == false 
i.contains(new DateTime(2010, 3, 2, 0, 0, 0, 0)); // == true 
i.contains(new DateTime(2010, 3, 4, 23, 59, 59, 999)); // == true 
i.contains(new DateTime(2010, 3, 5, 0, 0, 0, 0)); // == false 

Sin embargo, el concepto de su intervalo buscado LocalDates también conocido como un parcial (sin zonas horarias) no es todavía existe. Si vas a implementarlo por ti mismo, no implemente ninguna interfaz de intervalo. Interferiría con sus deseos, porque es, como se dijo antes, basado en instantes.

+0

Las clases y métodos relacionados con la medianoche fueron reemplazados en Joda-Time 2.3 por el método 'withTimeAtStartOfDay'. –

7

EDITAR: Oops, leyeron mal eso antes.

No, no hay nada equivalente en Joda Time que yo sepa.

Personalmente, me gustaría crear mi propia clase que incluye la fecha de inicio y finalización: LocalDateInterval o algo así. I no reutilizaríaInterval para esto, ya que sería confuso los conceptos: un par de LocalDate valores no representa representan dos instantes, ya que una fecha local no es realmente un instante.

Personalmente no encuentro Interval particularmente útil en Joda Time ... Había estado pensando en eliminarlo de Noda Time. Ahora parece que no debería;)

+0

Pero lo que necesito no es la duración, sino un intervalo específico. Por ejemplo: del 01/01/2011 al 01/10/2012. Voy a editar la pregunta para aclarar –

+0

Doh, lo siento, estoy contigo ahora. –

+0

¿Qué es el tiempo Noda? ¿Es esa la biblioteca personal de citas de Jon Skeet? –

4

Tenga en cuenta que al usar DateMidnight se producirá un error en el interruptor DST. Es mejor convertir usando date.toDateTimeAtStartOfDay().

+0

¿Puedes dar un ejemplo concreto de dónde fallaría? –

2

También necesité intervalos de objetos LocalDate pero JodaTime no los admite. Así que tuve que crear mi propia implementación. Más tarde he decidido pulirlo un poco y hacer código abierto.

Puede verificarlo: https://github.com/serddmitry/joda-interval (disponible en Maven Central).

24

Yo personalmente uso la clase Range de Guava.

Admite gamas abiertas. También es posible especificar límites incluidos o excluidos. Entre otras numerosas posibilidades, estas permiten representar fácilmente "antes de una fecha" o "después de una fecha".

Ejemplo para intervalos abiertos.

Range<LocalDate> before2010 = Range.atMost(new LocalDate("2009-12-31")); 
Range<LocalDate> alsoBefore2010 = Range.lessThan(new LocalDate("2010-01-01")); 

También ofrece fáciles predicados de prueba, como contains y containsAll, y una operación de intersección. Todo esto probado y mantenido.

1
public class LocalDateInterval { 

    private LocalDate begin; 
    private LocalDate end; 

    public LocalDateInterval(LocalDate begin, LocalDate end) { 
    this.begin = begin; 
    this.end = end; 
    } 



} 

Esto funciona para mí.

Cuestiones relacionadas