# Java - Calculer la différence entre deux LocalDateTime
# Calculer la différence dans une unité de temps données
Depuis Java 8, pour obtenir le nombre de jours, d'heures, de minutes, ...
exacte entre deux LocalDate
ou LocalDateTime
, le plus simple est d'utiliser
les ChronoUnit
du package java.time.temporal
.
Par exemple, ChronoUnit.HOURS.between(fromDate, toDate)
renvoie le nombre d'heures complètes
entre fromDate
(inclus) et toDate
(exclus).
Ci-dessous des exemples pour le nombre de jours, d'heures ou de secondes entre 2 dates:
- En jours
@Test
public void computeDifferenceBetweenDateInDays() {
LocalDateTime inclusiveFromDate = LocalDateTime.of(2019, 6, 12, 0, 0, 0);
LocalDateTime exclusiveToDate = inclusiveFromDate.plusDays(30).plusHours(16).plusSeconds(1);
long differenceInDays = ChronoUnit.DAYS.between(inclusiveFromDate, exclusiveToDate);
assertThat(differenceInDays).isEqualTo(30);
}
2
3
4
5
6
7
- En heures
@Test
public void computeDifferenceBetweenDateInHours() {
LocalDateTime inclusiveFromDate = LocalDateTime.of(2019, 6, 12, 0, 0, 0);
LocalDateTime exclusiveToDate = inclusiveFromDate.plusDays(30).plusHours(16).plusSeconds(1);
long differenceInHours = ChronoUnit.HOURS.between(inclusiveFromDate, exclusiveToDate);
assertThat(differenceInHours).isEqualTo(30 * 24 + 16);
}
2
3
4
5
6
7
- En secondes
@Test
public void computeDifferenceBetweenDateInSeconds() {
LocalDateTime inclusiveFromDate = LocalDateTime.of(2019, 6, 12, 0, 0, 0);
LocalDateTime exclusiveToDate = inclusiveFromDate.plusDays(30).plusHours(16).plusSeconds(1);
long differenceInSeconds = ChronoUnit.SECONDS.between(inclusiveFromDate, exclusiveToDate);
assertThat(differenceInSeconds).isEqualTo(30 * 24 * 3600 + 16 * 3600 + 1);
}
2
3
4
5
6
7
# Calculer la différence dans une unité de temps données
Il est également possible d'obtenir la différence entre deux dates en tant que Duration. Depuis Java 9 cela permet d'accéder aux unités de temps de cette différence séparément. Par exemple:
@Test
public void computeDifferenceBetweenDateAsDuration() {
LocalDateTime inclusiveFromDate = LocalDateTime.of(2019, 6, 12, 0, 0, 0);
LocalDateTime exclusiveToDate = inclusiveFromDate.plusDays(30).plusHours(16).plusSeconds(1);
Duration duration = Duration.between(inclusiveFromDate, exclusiveToDate);
assertThat(duration.toDaysPart()).isEqualTo(30);
assertThat(duration.toHoursPart()).isEqualTo(16);
assertThat(duration.toMinutesPart()).isEqualTo(0);
assertThat(duration.toSecondsPart()).isEqualTo(1);
}
2
3
4
5
6
7
8
9
10
# Gérer les timezones avec ZonedDateTime
WARNING
Les exemples précédents ne prennent pas en compte les timezones ni les changements d'heure (Daylight Saving Time). Ils considèrent donc que les deux dates sont dans la même timezone et qu'aucun changement d'heure n'est intervenu entre ces deux dates.
Dans certains cas, il est donc préférable de passer par la classe ZonedDateTime pour prendre en compte ces deux facteurs. Dans l'exemple ci-dessous, la date inclusiveFromDate est prise juste avant le changement d'heure et exclusiveToDate, juste après. Comme on peut le voir, le nombre d'heure de différence entre les deux n'est pas le même avec ou sans timezone:
@Test
public void computeDifferenceBetweenZonedDateInHours() {
LocalDateTime inclusiveFromDate = LocalDateTime.of(2019, 3, 31, 1, 59, 0);
LocalDateTime exclusiveToDate = inclusiveFromDate.plusHours(2);
long differenceInHours = ChronoUnit.HOURS.between(inclusiveFromDate, exclusiveToDate);
assertThat(differenceInHours).isEqualTo(2);
ZoneId frenchZoneId = ZoneId.of("Europe/Paris");
ZonedDateTime fromZonedDate = inclusiveFromDate.atZone(frenchZoneId);
ZonedDateTime toZonedDate = exclusiveToDate.atZone(frenchZoneId);
differenceInHours = ChronoUnit.HOURS.between(fromZonedDate, toZonedDate);
assertThat(differenceInHours).isEqualTo(1);
}
2
3
4
5
6
7
8
9
10
11
12