Periodo y duración en Java

1. Información general

En este tutorial rápido, veremos dos clases nuevas para trabajar con fechas introducidas en Java 8: Periodo y Duración .

Ambas clases se pueden utilizar para representar una cantidad de tiempo o determinar la diferencia entre dos fechas. La principal distinción entre las dos clases es que Period usa valores basados ​​en fecha, mientras que Duración usa valores basados ​​en tiempo.

2. Clase de período

La clase Period usa las unidades año, mes y día para representar un período de tiempo.

Podemos obtener un objeto Period como la diferencia entre dos fechas usando el método between () :

LocalDate startDate = LocalDate.of(2015, 2, 20); LocalDate endDate = LocalDate.of(2017, 1, 15); Period period = Period.between(startDate, endDate);

Luego, podemos determinar las unidades de fecha del período usando los métodos getYears (), getMonths (), getDays () :

LOG.info("Years:" + period.getYears() + " months:" + period.getMonths() + " days:"+period.getDays());

En este caso, el método isNegative () , que devuelve verdadero si alguna de las unidades es negativa, se puede usar para determinar si endDate es mayor que startDate :

assertFalse(period.isNegative());

Si isNegative () devuelve falso, entonces startDate es anterior al valor endDate .

Otra forma de crear un objeto Period se basa en la cantidad de días, meses, semanas o años utilizando métodos dedicados:

Period fromUnits = Period.of(3, 10, 10); Period fromDays = Period.ofDays(50); Period fromMonths = Period.ofMonths(5); Period fromYears = Period.ofYears(10); Period fromWeeks = Period.ofWeeks(40); assertEquals(280, fromWeeks.getDays());

Si solo está presente uno de los valores, por ejemplo, utilizando el método ofDays () , el valor de las otras unidades es 0.

En el caso del método ofWeeks () , el valor del parámetro se usa para establecer el número de días multiplicándolo por 7.

También podemos crear un objeto Period analizando una secuencia de texto , que debe tener el formato "PnYnMnD":

Period fromCharYears = Period.parse("P2Y"); assertEquals(2, fromCharYears.getYears()); Period fromCharUnits = Period.parse("P2Y3M5D"); assertEquals(5, fromCharUnits.getDays());

El valor del período se puede aumentar o disminuir utilizando métodos de la forma plusX () y minusX () , donde X representa la unidad de fecha:

assertEquals(56, period.plusDays(50).getDays()); assertEquals(9, period.minusMonths(2).getMonths());

3. Clase de duración

La clase Duración representa un intervalo de tiempo en segundos o nanosegundos y es más adecuada para manejar períodos de tiempo más cortos, en casos que requieren más precisión.

Podemos determinar la diferencia entre dos instantes como un objeto Duración usando el método between () :

Instant start = Instant.parse("2017-10-03T10:15:30.00Z"); Instant end = Instant.parse("2017-10-03T10:16:30.00Z"); Duration duration = Duration.between(start, end);

Luego podemos usar los métodos getSeconds () o getNanoseconds () para determinar el valor de las unidades de tiempo:

assertEquals(60, duration.getSeconds());

Alternativamente, podemos obtener una instancia de Duration de dos instancias de LocalDateTime:

LocalTime start = LocalTime.of(1, 20, 25, 1024); LocalTime end = LocalTime.of(3, 22, 27, 1544); Duration.between(start, end).getSeconds();

El método isNegative () se puede usar para verificar si el instante final es mayor que el instante inicial:

assertFalse(duration.isNegative());

También podemos obtener un objeto Duration basado en varias unidades de tiempo , usando los métodos deDays (), ofHours (), ofMillis (), ofMinutes (), ofNanos (), ofSeconds () :

Duration fromDays = Duration.ofDays(1); assertEquals(86400, fromDays.getSeconds()); Duration fromMinutes = Duration.ofMinutes(60);

Para crear un objeto Duration basado en una secuencia de texto, este debe tener el formato "PnDTnHnMn.nS":

Duration fromChar1 = Duration.parse("P1DT1H10M10.5S"); Duration fromChar2 = Duration.parse("PT10M");

Una duración se puede convertir a otras unidades de tiempo usando toDays (), toHours (), toMillis (), toMinutes () :

assertEquals(1, fromMinutes.toHours());

Un valor de duración se puede aumentar o disminuir utilizando métodos de la forma plusX () o minusX () , donde X puede representar días, horas, milis, minutos, nanos o segundos:

assertEquals(120, duration.plusSeconds(60).getSeconds()); assertEquals(30, duration.minusSeconds(30).getSeconds());

También podemos usar los métodos plus () y minus () con un parámetro que especifica la TemporalUnit para sumar o restar:

assertEquals(120, duration.plus(60, ChronoUnit.SECONDS).getSeconds()); assertEquals(30, duration.minus(30, ChronoUnit.SECONDS).getSeconds());

4. Conclusión

En este tutorial, mostramos cómo podemos usar las clases Periodo y Duración .

Como siempre, el código fuente completo de los ejemplos se puede encontrar en GitHub.