Période et durée en Java

Période et durée en Java

1. Vue d'ensemble

Dans ce rapide tutoriel, nous allons jeter un œil à deux nouvelles classes pour travailler avec les dates introduites dans Java 8:Period etDuration.

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 quePeriod utilise des valeurs basées sur la date, tandis queDuration utilise des valeurs basées sur le temps.

2. ClassePeriod

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

Nous pouvons obtenir un objetPeriod comme différence entre deux dates en utilisant la méthodebetween():

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éthodesgetYears(), getMonths(), getDays():

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

Dans ce cas, la méthodeisNegative(), qui renvoietrue si l'une des unités est négative, peut être utilisée pour déterminer si leendDate est supérieur austartDate:

assertFalse(period.isNegative());

SiisNegative() renvoie faux, alors lestartDate est antérieur à la valeurendDate.

Une autre façon decreate a Period object is based on the number of days, months, weeks or years en utilisant des 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éthodeofDays(), alors la valeur des autres unités est 0.

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

On peut aussicreate a Period object by parsing a text sequence, 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 formeplusX() etminusX(), où X représente l'unité de date:

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

3. ClasseDuration

La classeDuration représente un intervalle de temps en secondes ou nanosecondes et est la plus adaptée pour traiter 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'objetDuration en utilisant la méthodebetween():

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éthodesgetSeconds() ougetNanoseconds() 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éthodeisNegative() 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 aussiobtain a Duration object based on several time units, en utilisant les méthodesofDays(), ofHours(), ofMillis(), ofMinutes(), ofNanos(), ofSeconds():

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

Duration fromMinutes = Duration.ofMinutes(60);

Pour créer un objetDuration 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");

A duration can be converted to other time units en utilisanttoDays(), 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 formeplusX() ouminusX(), 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éthodesplus() etminus() avec un paramètre qui spécifie lesTemporalUnit à 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 classesPeriod etDuration.

Comme toujours, le code source complet des exemples peut être trouvéover on GitHub.