Période et durée en Java

1. Vue d'ensemble

Dans ce tutoriel rapide, nous allons jeter un œil à deux nouvelles classes pour travailler avec les dates introduites dans Java 8: Période et Durée .

Les deux classes peuvent être utilisées pour représenter une durée ou déterminer la différence entre deux dates. La principale distinction entre les deux classes est que Period utilise des valeurs basées sur la date, tandis que Duration utilise des valeurs basées sur le temps.

2. Classe de période

La classe Period utilise les unités année, mois et jour pour représenter une période de temps.

Nous pouvons obtenir un objet Period comme différence entre deux dates en utilisant la méthode between () :

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

Ensuite, nous pouvons déterminer les unités de date de la période en utilisant les méthodes getYears (), getMonths (), getDays () :

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

Dans ce cas, la méthode isNegative () , qui renvoie true si l'une des unités est négative, peut être utilisée pour déterminer si endDate est supérieur à startDate :

assertFalse(period.isNegative());

Si isNegative () renvoie false, alors la valeur startDate est antérieure à la valeur endDate .

Une autre façon de créer un objet Period est basée sur le nombre de jours, mois, semaines ou années à l' aide de méthodes dédiées:

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 une seule des valeurs est présente, par exemple en utilisant la méthode ofDays () , la valeur des autres unités est 0.

Dans le cas de la méthode ofWeeks () , la valeur du paramètre est utilisée pour définir le nombre de jours en le multipliant par 7.

Nous pouvons également créer un objet Period en analysant une séquence de texte , qui doit avoir le format «PnYnMnD»:

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

La valeur de la période peut être augmentée ou diminuée en utilisant des méthodes de la forme plusX () et minusX () , où X représente l'unité de date:

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

3. Classe de durée

La classe Duration représente un intervalle de temps en secondes ou nanosecondes et est la plus adaptée pour gérer des durées plus courtes, dans les cas qui nécessitent plus de précision.

Nous pouvons déterminer la différence entre deux instants en tant qu'objet Duration en utilisant la méthode 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);

Ensuite, nous pouvons utiliser les méthodes getSeconds () ou getNanoseconds () pour déterminer la valeur des unités de temps:

assertEquals(60, duration.getSeconds());

Alternativement, nous pouvons obtenir une instance Duration à partir de deux instances LocalDateTime:

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

La méthode isNegative () peut être utilisée pour vérifier si l'instant de fin est supérieur à l'instant de début:

assertFalse(duration.isNegative());

On peut également obtenir un objet Duration basé sur plusieurs unités de temps , en utilisant les méthodes ofDays (), ofHours (), ofMillis (), ofMinutes (), ofNanos (), ofSeconds () :

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

Pour créer un objet Duration basé sur une séquence de texte, celui-ci doit être de la forme «PnDTnHnMn.nS»:

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

Une durée peut être convertie en d'autres unités de temps en utilisant toDays (), toHours (), toMillis (), toMinutes () :

assertEquals(1, fromMinutes.toHours());

Une valeur de durée peut être augmentée ou diminuée en utilisant des méthodes de la forme plusX () ou minusX () , où X peut représenter des jours, des heures, des millis, des minutes, des nanos ou des secondes:

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

Nous pouvons également utiliser les méthodes plus () et moins () avec un paramètre qui spécifie le TemporalUnit à ajouter ou à soustraire:

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

4. Conclusion

Dans ce didacticiel, nous avons montré comment utiliser les classes Période et Durée .

Comme toujours, le code source complet des exemples est disponible à l'adresse over sur GitHub.