Intervalos de tiempo
En Java, las clases Period y Duration son parte del paquete java.time y se usan para representar intervalos de tiempo, pero tienen un comportamiento diferente.
Clase Period
La clase Period es ideal para representar intervalos que se cuentan en días, meses y años. Se usa mucho para cálculos como determinar la edad o el tiempo entre dos fechas en lenguaje humano. Por ejemplo, en lugar de decir 40 días, generalmente decimos 1 mes y 10 días.
until()La diferencia del método until con Period y Duration es que mientras que until nos da el valor total para una determinada unidad de tiempo, las otras dos clases dan solo el valor parcial de esa unidad de tiempo.
Por ejemplo, cuando until nos da 35 días, Period en días nos devolverá 5. Esto se debe a que Period solo nos da los días cuando está formado por tres componentes. Si pidiéramos los meses al objeto Period nos devolvería 1.
Digamos que Period nos da la diferencia en varias componentes de unidades de tiempo mientras que until da el total en una determinada unidad de tiempo.
Podemos crear un Period para obtener el tiempo entre dos fechas LocalDate:
LocalDate inicio = LocalDate.of(2020, 1, 1);
LocalDate fin = LocalDate.of(2023, 10, 17);
Period intervalo = Period.between(inicio, fin);
Si fin es anterior a inicio los valores que nos devolverá serán negativos.
Para obtener las componentes del período:
int anos = intervalo.getYears();
int meses = intervalo.getMonths();
int dias = intervalo.getDays();
Clase Duration
La clase Duration es ideal para representar intervalos de tiempo más cortos, medidos en horas, minutos, segundos y nanosegundos. Se usa mucho para medir duraciones de eventos o diferencias de tiempo.
Podemos crear una Duration entre dos instancias temporales (LocalTime, LocalDateTime, etc.):
LocalTime inicio = LocalTime.of(14, 30);
LocalTime fin = LocalTime.of(18, 45);
Duration duracion = Duration.between(inicio, fin);
Si fin es anterior a inicio los valores que nos devolverá serán negativos.
Otros métodos de Duration:
long horas = duracion.toHours(); // Duración en horas
long minutos = duracion.toMinutes(); // Duración en minutos
long segundos = duracion.toSeconds(); // Duración en segundos