java - examples - Intervalo de LocalDate en Joda-time
jodatime online (6)
EDITAR: Ups, leyeron mal eso antes.
No, no hay nada equivalente en Joda Time que yo sepa.
Personalmente solo crearía mi propia clase que incluía la fecha de inicio y finalización: LocalDateInterval
o algo así. No volvería a utilizar Interval
para esto, ya que confundiría los conceptos: un par de valores de LocalDate
no representan dos instantes, ya que una fecha local no es realmente un instante.
Personalmente, no encuentro que Interval
particularmente útil en Joda Time ... He estado considerando retirarlo de Noda Time. Ahora suena como que no debería;)
Joda-time tiene una clase Interval , que es un rango entre DateTime s. ¿Qué se puede utilizar para un rango de LocalDate s?
Quiero un objeto que represente, por ejemplo, "desde el 1/1/2011 al 10/1/2011", sin que el tiempo (o las zonas horarias) llegue a la imagen.
Por lo que veo, joda-time no tiene nada incorporado para eso. Si no existe nada para eso, 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 que implementara ReadableInterval
, donde getStart
y getEnd
devuelven DateMidnight
?
La clase de Interval representa un intervalo de tiempo de un instante de milisegundos a otro instantáneo (completo con 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 para LocalDates también conocido como Parcial (sin zonas horarias), aún no existe. Si vas a implementarlo por ti mismo, no implementes ninguna interfaz de intervalo. Interferiría con sus deseos, porque es, como se dijo antes, basado en instantes.
Personalmente uso la clase Range de Guava.
Admite rangos abiertos. También es posible especificar los 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.
También necesitaba intervalos de objetos LocalDate, pero no es compatible con JodaTime. 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).
Tenga en cuenta que al usar DateMidnight
fallará en el interruptor DST. Es mejor convertir utilizando date.toDateTimeAtStartOfDay()
.
public class LocalDateInterval {
private LocalDate begin;
private LocalDate end;
public LocalDateInterval(LocalDate begin, LocalDate end) {
this.begin = begin;
this.end = end;
}
}
Esto funciona para mi