12. Date et heure en Java
Table des matières
- 12.1 Date et heure
- 12.2 Méthodes withXxx
- 12.3 Conversion et méthodes at (lier date, heure et zone)
- 12.4 Period, Duration et Instant
- 12.5 Period — Durées humaines basées sur la date
- 12.6 Duration — Durées machine basées sur le temps
- 12.7 Instant — Point sur la chronologie UTC
- 12.8 Tableau récapitulatif : Period vs Duration vs Instant
- 12.9 TemporalUnit et TemporalAmount
12.1 Date et heure
Java fournit une API moderne, cohérente et immuable de date/heure dans le package java.time.*.
Cette API remplace les anciennes classes java.util.Date et java.util.Calendar.
Selon le niveau de détail requis, Java propose quatre classes principales :
LocalDate→ représente une date uniquement (année–mois–jour)LocalTime→ représente une heure uniquement (heure–minute–seconde–nanoseconde)LocalDateTime→ combine date + heure, mais sans fuseau horaireZonedDateTime→ date + heure + décalage + fuseau horaire
Note
- Un fuseau horaire définit des règles comme les changements d’heure d’été (par exemple,
Europe/Paris). - Un décalage de zone (zone offset) est un décalage fixe par rapport à UTC/GMT (par exemple,
+01:00,-07:00). - Pour comparer deux instants provenant de fuseaux horaires différents, convertissez-les en UTC (GMT) en appliquant le décalage.
Obtenir la date/heure actuelle
Vous pouvez récupérer les valeurs système actuelles en utilisant les méthodes statiques now() :
System.out.println(LocalDate.now());
System.out.println(LocalTime.now());
System.out.println(LocalDateTime.now());
System.out.println(ZonedDateTime.now());
- Exemple de sortie (votre système peut différer) :
2025-12-01
19:11:53.213856300
2025-12-01T19:11:53.213856300
2025-12-01T19:11:53.214856900+01:00[Europe/Paris]
- Exemple : conversion de
ZonedDateTimevers GMT (UTC)
// Conceptual examples (not real code, just illustrating offsets):
// 2024-07-01T12:00+09:00[Asia/Tokyo] ---> 12:00 minus 9 hours ---> 03:00 UTC
// 2024-07-01T20:00-07:00[America/Los_Angeles] ---> 20:00 plus 7 hours ---> 03:00 UTC
Les deux représentent le même instant dans le temps, simplement exprimé dans des fuseaux horaires différents.
12.1.1 Créer des dates et heures spécifiques
Vous pouvez construire des objets date/heure précis en utilisant les méthodes de fabrique of().
Toutes les classes incluent plusieurs versions surchargées de of() (seules les plus courantes sont listées ici).
**LocalDate — formes surchargées de of()
of(int year, int month, int dayOfMonth)of(int year, Month month, int dayOfMonth)
**LocalTime — formes surchargées de of()
of(int hour, int minute)of(int hour, int minute, int second)of(int hour, int minute, int second, int nanoOfSecond)
**LocalDateTime — formes surchargées de of()
of(int year, int month, int day, int hour, int minute)of(int year, int month, int day, int hour, int minute, int second)of(int year, int month, int day, int hour, int minute, int second, int nano)of(LocalDate date, LocalTime time)
**ZonedDateTime — formes surchargées de of()
of(LocalDate date, LocalTime time, ZoneId zone)-
of(int y, int m, int d, int h, int min, int s, int nano, ZoneId zone) -
Exemples
// Creating specific dates
var localDate1 = LocalDate.of(2025, 7, 31);
var localDate2 = LocalDate.of(2025, Month.JULY, 31);
// Creating specific times
var localTime1 = LocalTime.of(13, 21);
System.out.println(localTime1); // 13:21
System.out.println(LocalTime.of(13, 21, 52)); // 13:21:52
System.out.println(LocalTime.of(13, 21, 52, 200)); // 13:21:52.000000200
// Creating LocalDateTime
var localDateTime1 = LocalDateTime.of(2025, 7, 31, 13, 55, 22);
var localDateTime2 = LocalDateTime.of(localDate1, localTime1);
// Creating a ZonedDateTime
var zoned = ZonedDateTime.of(2025, 7, 31, 13, 55, 22, 0, ZoneId.of("Europe/Paris"));
12.1.2 Arithmétique date/heure : méthodes plus et minus
Toutes les classes du package java.time (comme LocalDate, LocalTime, LocalDateTime, ZonedDateTime, etc.) sont immutables.
Cela signifie que des méthodes comme plusXxx() et minusXxx() ne modifient jamais l’objet original — elles renvoient à la place une nouvelle instance avec la valeur ajustée.
12.1.3 Modèles courants
La plupart des classes date/heure prennent en charge trois types de méthodes arithmétiques :
-
Raccourcis spécifiques au type
-
plusDays(long daysToAdd) plusHours(long hoursToAdd)-
etc.
-
Méthodes génériques basées sur une quantité
-
plus(TemporalAmount amount)→ par exemplePeriod,Duration -
minus(TemporalAmount amount) -
Méthodes génériques basées sur une unité
-
plus(long amountToAdd, TemporalUnit unit) minus(long amountToSubtract, TemporalUnit unit)
Elles permettent une arithmétique de date/heure flexible et lisible.
12.1.4 Arithmétique LocalDate
LocalDate représente une date uniquement (pas d’heure, pas de zone).
Principales méthodes plus / minus (surcharges)
| Méthode | Description |
|---|---|
plusDays(long days) |
Ajouter des jours |
plusWeeks(long weeks) |
Ajouter des semaines |
plusMonths(long months) |
Ajouter des mois |
plusYears(long years) |
Ajouter des années |
minusDays(long days) |
Soustraire des jours |
minusWeeks(long weeks) |
Soustraire des semaines |
minusMonths(long months) |
Soustraire des mois |
minusYears(long years) |
Soustraire des années |
plus(TemporalAmount amount) |
Ajouter une Period |
minus(TemporalAmount amount) |
Soustraire une Period |
plus(long amountToAdd, TemporalUnit unit) |
Ajouter en utilisant ChronoUnit (par ex. DAYS, MONTHS) |
minus(long amountToSubtract, TemporalUnit unit) |
Soustraire en utilisant ChronoUnit |
- Exemples :
LocalDate date = LocalDate.of(2025, 3, 10);
LocalDate d1 = date.plusDays(5); // 2025-03-15
LocalDate d2 = date.minusWeeks(2); // 2025-02-24
LocalDate d3 = date.plusMonths(1); // 2025-04-10
LocalDate d4 = date.plusYears(2); // 2027-03-10
// Using ChronoUnit
LocalDate d5 = date.plus(10, ChronoUnit.DAYS); // 2025-03-20
// Using Period
Period p = Period.of(1, 2, 3); // 1 year, 2 months, 3 days
LocalDate d6 = date.plus(p);
12.1.5 Arithmétique LocalTime
LocalTime représente une heure uniquement (pas de date, pas de zone).
Principales méthodes plus / minus (surcharges)
| Méthode | Description |
|---|---|
plusNanos(long nanos) |
Ajouter des nanosecondes |
plusSeconds(long seconds) |
Ajouter des secondes |
plusMinutes(long minutes) |
Ajouter des minutes |
plusHours(long hours) |
Ajouter des heures |
minusNanos(long nanos) |
Soustraire des nanosecondes |
minusSeconds(long seconds) |
Soustraire des secondes |
minusMinutes(long minutes) |
Soustraire des minutes |
minusHours(long hours) |
Soustraire des heures |
plus(TemporalAmount amount) |
Ajouter une Duration |
minus(TemporalAmount amount) |
Soustraire une Duration |
plus(long amountToAdd, TemporalUnit unit) |
Ajouter en utilisant ChronoUnit |
minus(long amountToSubtract, TemporalUnit unit) |
Soustraire en utilisant ChronoUnit |
- Exemples
LocalTime time = LocalTime.of(13, 30); // 13:30
LocalTime t1 = time.plusHours(2); // 15:30
LocalTime t2 = time.minusMinutes(45); // 12:45
LocalTime t3 = time.plusSeconds(90); // 13:31:30
// Using ChronoUnit
LocalTime t4 = time.plus(3, ChronoUnit.HOURS); // 16:30
// Using Duration
Duration d = Duration.ofMinutes(90);
LocalTime t5 = time.plus(d); // 15:00
Note
Quand l’arithmétique des heures franchit minuit, la date est ignorée avec LocalTime.
Par exemple, 23:30 + 2 heures = 01:30 (sans date impliquée).
12.1.6 Arithmétique LocalDateTime
LocalDateTime combine date + heure, mais toujours sans fuseau horaire.
Il prend en charge à la fois les méthodes de raccourci liées à la date et celles liées à l’heure.
Principales méthodes plus / minus (surcharges)
| Méthode | Description |
|---|---|
plusYears(long years) / minusYears(long years) |
Ajuster les années |
plusMonths(long months) / minusMonths(long months) |
Ajuster les mois |
plusWeeks(long weeks) / minusWeeks(long weeks) |
Ajuster les semaines |
plusDays(long days) / minusDays(long days) |
Ajuster les jours |
plusHours(long hours) / minusHours(long hours) |
Ajuster les heures |
plusMinutes(long minutes) / minusMinutes(long minutes) |
Ajuster les minutes |
plusSeconds(long seconds) / minusSeconds(long seconds) |
Ajuster les secondes |
plusNanos(long nanos) / minusNanos(long nanos) |
Ajuster les nanosecondes |
plus(TemporalAmount amount) / minus(TemporalAmount amount) |
Ajouter/soustraire Period ou Duration |
plus(long amountToAdd, TemporalUnit unit) / minus(long amountToSubtract, TemporalUnit unit) |
En utilisant ChronoUnit |
- Exemples
LocalDateTime ldt = LocalDateTime.of(2025, 3, 10, 13, 30); // 2025-03-10T13:30
LocalDateTime l1 = ldt.plusDays(1); // 2025-03-11T13:30
LocalDateTime l2 = ldt.minusHours(3); // 2025-03-10T10:30
LocalDateTime l3 = ldt.plusMinutes(90); // 2025-03-10T15:00
// Using ChronoUnit
LocalDateTime l4 = ldt.plus(2, ChronoUnit.WEEKS); // 2025-03-24T13:30
// Using Period and Duration
Period p = Period.ofDays(10);
Duration d = Duration.ofHours(5);
LocalDateTime l5 = ldt.plus(p); // 2025-03-20T13:30
LocalDateTime l6 = ldt.plus(d); // 2025-03-10T18:30
12.1.7 Arithmétique ZonedDateTime
ZonedDateTime représente date + heure + fuseau horaire + décalage.
Il prend en charge les mêmes méthodes plus/minus que LocalDateTime, mais avec une attention supplémentaire aux fuseaux horaires et à l’heure d’été (DST).
Principales méthodes plus / minus (surcharges)
| Méthode | Description |
|---|---|
plusYears(long years) / minusYears(long years) |
Ajuster les années |
plusMonths(long months) / minusMonths(long months) |
Ajuster les mois |
plusWeeks(long weeks) / minusWeeks(long weeks) |
Ajuster les semaines |
plusDays(long days) / minusDays(long days) |
Ajuster les jours |
plusHours(long hours) / minusHours(long hours) |
Ajuster les heures |
plusMinutes(long minutes) / minusMinutes(long minutes) |
Ajuster les minutes |
plusSeconds(long seconds) / minusSeconds(long seconds) |
Ajuster les secondes |
plusNanos(long nanos) / minusNanos(long nanos) |
Ajuster les nanosecondes |
plus(TemporalAmount amount) / minus(TemporalAmount amount) |
Period / Duration |
plus(long amountToAdd, TemporalUnit unit) / minus(long amountToSubtract, TemporalUnit unit) |
En utilisant ChronoUnit |
- Exemples (avec fuseaux horaires et DST) :
ZonedDateTime zdt = ZonedDateTime.of(
2025, 3, 30, 1, 30, 0, 0,
ZoneId.of("Europe/Paris")
);
// Add 2 hours across a possible DST change
ZonedDateTime z1 = zdt.plusHours(2);
System.out.println(zdt);
System.out.println(z1);
Selon les règles d’heure d’été pour cette date :
- L’heure locale peut passer de 02:00 à 03:00 ou similaire.
ZonedDateTimeajuste le décalage et l’heure locale selon les règles de zone, mais représente toujours le bon instant sur la timeline.
Important
Pour ZonedDateTime, l’arithmétique est définie en fonction de la timeline locale et des règles de fuseau horaire, ce qui peut provoquer des décalages d’heures pendant les transitions DST.
12.1.8 Tableau récapitulatif
| Classe | Méthodes plus/minus de raccourci | Méthodes génériques |
|---|---|---|
| LocalDate | plusDays, plusWeeks, plusMonths, plusYears (et minus) | plus/minus(TemporalAmount), plus/minus(long, TemporalUnit) |
| LocalTime | plusNanos, plusSeconds, plusMinutes, plusHours (et minus) | plus/minus(TemporalAmount), plus/minus(long, TemporalUnit) |
| LocalDateTime | Tous les raccourcis de LocalDate + LocalTime | plus/minus(TemporalAmount), plus/minus(long, TemporalUnit) |
| ZonedDateTime | Identiques à LocalDateTime, mais sensibles à la zone | plus/minus(TemporalAmount), plus/minus(long, TemporalUnit) |
12.2 Méthodes withXxx(...)
Les méthodes with... renvoient une copie de l’objet avec un champ modifié.
Elles ne mutent jamais l’instance originale.
| Classe | Méthodes with... courantes (non exhaustif) | Description |
|---|---|---|
LocalDate |
withYear(int year) | Même date, mais avec une année différente |
| LocalDate | LocalDate.withMonth(int month) | Même date, mois différent (1–12) |
| LocalDate | LocalDate.withDayOfMonth(int dayOfMonth) | Même date, jour du mois différent |
| LocalDate | LocalDate.with(TemporalField field, long newValue) | Ajustement générique basé sur un champ |
| LocalDate | LocalDate.with(TemporalAdjuster adjuster) | Utilise un adjuster (par ex. firstDayOfMonth()) |
LocalTime |
withHour(int hour) | Même heure, heure différente |
| LocalTime | LocalTime.withMinute(int minute) | Même heure, minute différente |
| LocalTime | LocalTime.withSecond(int second) | Même heure, seconde différente |
| LocalTime | LocalTime.withNano(int nanoOfSecond) | Même heure, nanoseconde différente |
| LocalTime | LocalTime.with(TemporalField field, long newValue) | Ajustement générique basé sur un champ |
| LocalTime | LocalTime.with(TemporalAdjuster adjuster) | Ajuster via un temporal adjuster |
LocalDateTime |
withYear(int year), withMonth(int month), withDayOfMonth(int day) | Changer uniquement la partie date |
| LocalDateTime | withHour(int hour), withMinute(int minute), withSecond(int second) | Changer uniquement la partie heure |
| LocalDateTime | withNano(int nanoOfSecond) | Changer la nanoseconde |
| LocalDateTime | with(TemporalField field, long newValue) | Ajustement générique basé sur un champ |
| LocalDateTime | with(TemporalAdjuster adjuster) | Ajuster via un temporal adjuster |
ZonedDateTime |
tous les withXxx(...) de LocalDateTime | Changer les composants locaux date/heure |
| ZonedDateTime | withZoneSameInstant(ZoneId zone) | Même instant, zone différente (change l’heure locale) |
| ZonedDateTime | withZoneSameLocal(ZoneId zone) | Même date/heure locale, zone différente (change l’instant) |
12.3 Conversion et méthodes at... (lier date, heure et zone)
Ces méthodes sont utilisées pour combiner ou convertir entre LocalDate, LocalTime, LocalDateTime et ZonedDateTime.
| Depuis | Méthode | Résultat | Description |
|---|---|---|---|
LocalDate |
atTime(LocalTime time) | LocalDateTime | Combine cette date avec une heure donnée |
| LocalDate | atTime(int hour, int minute) | LocalDateTime | Surcharges de convenance avec des composantes horaires numériques |
| LocalDate | atTime(int hour, int minute, int second) | LocalDateTime | — |
| LocalDate | atTime(int hour, int minute, int second, int nano) | LocalDateTime | — |
| LocalDate | atStartOfDay() | LocalDateTime | Cette date à l’heure 00:00 |
| LocalDate | atStartOfDay(ZoneId zone) | ZonedDateTime | Cette date au début de la journée dans une zone spécifique |
LocalTime |
atDate(LocalDate date) | LocalDateTime | Combine cette heure avec une date donnée |
LocalDateTime |
atZone(ZoneId zone) | ZonedDateTime | Ajoute un fuseau horaire à une date-heure locale |
| LocalDateTime | toLocalDate() | LocalDate | Extrait la composante date |
| LocalDateTime | toLocalTime() | LocalTime | Extrait la composante heure |
ZonedDateTime |
toLocalDate() | LocalDate | Supprime zone/décalage, conserve la date locale |
| ZonedDateTime | toLocalTime() | LocalTime | Supprime zone/décalage, conserve l’heure locale |
| ZonedDateTime | toLocalDateTime() | LocalDateTime | Supprime zone/décalage, conserve la date-heure locale |
12.4 Period, Duration et Instant
Le package java.time fournit trois classes temporelles essentielles qui représentent des durées ou des points sur la timeline :
- Period → durées humaines basées sur la date (années, mois, jours)
- Duration → durées machine basées sur le temps (secondes, nanosecondes)
- Instant → un point sur la timeline UTC
12.5 Period — Durées humaines basées sur la date
Period représente une durée basée sur la date, telle que “3 ans, 2 mois et 5 jours”.
Il est utilisé avec LocalDate et LocalDateTime (car ils contiennent des parties date).
Méthodes de création
| Méthode | Description |
|---|---|
| Period.ofYears(int years) | Uniquement des années |
| Period.ofMonths(int months) | Uniquement des mois |
| Period.ofWeeks(int weeks) | Convertit les semaines en jours |
| Period.ofDays(int days) | Uniquement des jours |
| Period.of(int years, int months, int days) | Période complète |
| Period.parse(CharSequence text) | Format ISO-8601 : "P1Y2M3D", "P7D", "P1W", ... |
Propriétés clés
- Ne prend pas en charge les heures, minutes, secondes, nanosecondes.
- Peut être négatif.
-
Immuable.
-
Exemples
Period p1 = Period.ofYears(1); // P1Y
Period p2 = Period.of(1, 2, 3); // P1Y2M3D
Period p3 = Period.ofWeeks(2); // P14D (converted to days)
LocalDate base = LocalDate.of(2025, 1, 10);
LocalDate result = base.plus(p2); // 2026-03-13
Note
Period.parse("P1W") est autorisé et représente une période de 7 jours (équivalente à "P7D").
Tip
Period est basé sur le calendrier : ajouter une période de mois/années respecte la longueur des mois et les années bissextiles.
12.6 Duration — Durées machine basées sur le temps
Duration représente une durée basée sur le temps en secondes et nanosecondes.
Il est utilisé avec LocalTime, LocalDateTime, ZonedDateTime et Instant.
Méthodes de création
| Méthode | Description |
|---|---|
| Duration.ofDays(long days) | Convertit les jours en secondes |
| Duration.ofHours(long hours) | Convertit les heures en secondes |
| Duration.ofMinutes(long minutes) | Convertit les minutes en secondes |
| Duration.ofSeconds(long seconds) | Représentation de base en secondes |
| Duration.ofSeconds(long seconds, long nanoAdjustment) | Secondes plus nanos supplémentaires |
| Duration.ofMillis(long millis) | Convertit les millisecondes en nanos |
| Duration.ofNanos(long nanos) | Uniquement des nanosecondes |
| Duration.between(Temporal start, Temporal end) | Calculer la durée entre deux instants |
| Duration.parse(CharSequence text) | ISO : "PT20H", "PT15M", "PT10S" |
Caractéristiques clés
- Prend en charge des heures jusqu’aux nanosecondes, mais pas les années/mois/semaines directement.
- Idéal pour des calculs temporels au niveau machine.
-
Immuable.
-
Exemples
Duration d1 = Duration.ofHours(5); // PT5H
Duration d2 = Duration.ofMinutes(90); // PT1H30M
LocalTime t = LocalTime.of(10, 0);
LocalTime t2 = t.plus(d2); // 11:30
ZonedDateTime z1 = ZonedDateTime.of(
2024, 3, 30, 1, 0, 0, 0,
ZoneId.of("Europe/Paris")
);
ZonedDateTime z2 = z1.plusHours(2); // DST-aware
ZonedDateTime z3 = z1.plus(d2); // Duration-based
Note
Duration.ofDays(1) représente exactement 24 heures de temps machine.
Dans une zone avec DST, 24 heures peuvent ne pas correspondre à “la même heure locale demain”.
12.7 Instant — Point sur la chronologie UTC
Instant représente un seul moment dans le temps par rapport à UTC, avec une précision à la nanoseconde.
Il contient :
- Des secondes depuis l’époque (1970-01-01T00:00Z).
- Un ajustement de nanosecondes.
Méthodes de création
| Méthode | Description |
|---|---|
| Instant.now() | Moment actuel en UTC |
| Instant.ofEpochSecond(long seconds) | À partir des secondes depuis l’époque |
| Instant.ofEpochSecond(long seconds, long nanos) | À partir des secondes plus nanos |
| Instant.ofEpochMilli(long millis) | À partir des millisecondes depuis l’époque |
| Instant.parse(CharSequence text) | ISO : "2024-01-01T10:15:30Z" |
Conversions
| Action | Méthode |
|---|---|
| Instant → heure zonée | instant.atZone(zoneId) |
| ZonedDateTime → Instant | zdt.toInstant() |
| LocalDateTime → Instant | Non autorisé directement (nécessite une zone) |
- Exemple
Instant i = Instant.now();
ZonedDateTime z = i.atZone(ZoneId.of("Europe/Paris"));
Instant back = z.toInstant(); // same moment
// Duration between instants
Instant start = Instant.parse("2024-01-01T10:00:00Z");
Instant end = Instant.parse("2024-01-01T12:30:00Z");
Duration between = Duration.between(start, end); // PT2H30M
Important
Instant est toujours en UTC, sans information de fuseau horaire attachée.
Il ne peut pas être combiné avec une Period ; utilisez Duration à la place.
12.8 Tableau récapitulatif (Period vs Duration vs Instant)
| Concept | Représente | Bon pour | Fonctionne avec | Notes |
|---|---|---|---|---|
| Period | Années, mois, jours | Arithmétique calendaire | LocalDate, LocalDateTime | Unités humaines |
| Duration | Heures à nanosecondes | Calculs temporels précis | LocalTime, LocalDateTime, ZonedDateTime, Instant | Unités machine |
| Instant | Point exact sur la timeline UTC | Représentation d’horodatage | Convertible vers/depuis ZonedDateTime | Ne peut pas être combiné avec Period |
Pièges courants
Period.of(1, 0, 0)n’est pas la même chose queDuration.ofDays(365)(années bissextiles !).Duration.ofDays(1)peut ne pas être égal à une “journée calendaire” complète dans une zone DST.LocalDateTimene peut pas être converti enInstantsans fuseau horaire.Period.parse("P1W")est valide et donne une période de 7 jours.
12.9 TemporalUnit et TemporalAmount
L’API java.time repose sur deux interfaces clés qui définissent comment les dates, les heures et les durées sont manipulées :
TemporalUnit→ représente une unité de temps (par exemple, DAYS, HOURS, MINUTES).TemporalAmount→ représente une quantité de temps (par exemple,Period,Duration).
Les deux sont essentiels pour comprendre comment fonctionnent les méthodes plus, minus et with.
12.9.1 TemporalUnit
TemporalUnit représente une seule unité de mesure date/heure.
L’implémentation principale utilisée en Java est :
12.9.2 Enum ChronoUnit
Cet enum fournit les unités standard utilisées dans la chronologie ISO-8601 :
| Catégorie | Unités |
|---|---|
| Unités de date | DAYS, WEEKS, MONTHS, YEARS, DECADES, CENTURIES, MILLENNIA, ERAS |
| Unités de temps | NANOS, MICROS, MILLIS, SECONDS, MINUTES, HOURS, HALF_DAYS |
| Spécial | FOREVER |
Un TemporalUnit peut être utilisé directement avec les méthodes plus() et minus().
- Exemples avec
ChronoUnit:
LocalDate date = LocalDate.of(2025, 3, 10);
LocalDate d1 = date.plus(10, ChronoUnit.DAYS); // 2025-03-20
LocalDate d2 = date.minus(2, ChronoUnit.MONTHS); // 2025-01-10
LocalTime time = LocalTime.of(10, 0);
LocalTime t1 = time.plus(90, ChronoUnit.MINUTES); // 11:30
Important
Vous ne pouvez pas utiliser des unités basées sur le temps avec LocalDate, ni des unités basées sur la date avec LocalTime.
- Exemples :
// ❌ UnsupportedTemporalTypeException
LocalDate d = LocalDate.now().plus(5, ChronoUnit.HOURS);
// ❌ UnsupportedTemporalTypeException
LocalTime t = LocalTime.now().plus(1, ChronoUnit.DAYS);
12.9.3 TemporalAmount
TemporalAmount représente une quantité de temps à unités multiples (par exemple, “2 ans, 3 mois”, ou “90 minutes”).
Elle est implémentée par :
Period→ années, mois, jours (basé sur la date)Duration→ secondes, nanosecondes (basé sur le temps)
Les deux peuvent être passés aux objets date/heure pour les ajuster via plus() et minus().
12.9.4 Period en tant que TemporalAmount
Period représente une quantité humaine : années, mois, jours.
- Exemples :
Period p = Period.of(1, 2, 3); // 1 year, 2 months, 3 days
LocalDate base = LocalDate.of(2025, 3, 10);
LocalDate result = base.plus(p); // 2026-05-13
Notes
Periodne peut pas être utilisé avecLocalTime(pas de composante date).Period.ofWeeks(n)est converti en interne en jours (n × 7).
12.9.5 Duration en tant que TemporalAmount
Duration représente un temps machine : secondes + nanosecondes.
- Exemples :
Duration d = Duration.ofHours(5).plusMinutes(30); // PT5H30M
LocalDateTime ldt = LocalDateTime.of(2025, 3, 10, 10, 0);
LocalDateTime result = ldt.plus(d); // 2025-03-10T15:30
Notes
Durationpeut être utilisée avec des classes qui ont des composantes de temps (LocalTime,LocalDateTime,ZonedDateTime,Instant).Durationne peut pas être appliquée àLocalDate→ cela lanceUnsupportedTemporalTypeException.Durationinteragit avec les zones et les transitions DST lorsqu’elle est appliquée àZonedDateTime.
12.9.6 Utiliser TemporalAmount vs TemporalUnit
Utiliser un TemporalUnit :
LocalDate d1 = LocalDate.now().plus(5, ChronoUnit.DAYS);
Utiliser un TemporalAmount :
Period p = Period.ofDays(5);
LocalDate d2 = LocalDate.now().plus(p);
Les deux produisent le même résultat lorsque c’est pris en charge.
Différences
| Aspect | TemporalUnit | TemporalAmount |
|---|---|---|
| Représente | Une seule unité (par ex. DAYS) | Une quantité structurée (par ex. 2Y, 5M, 3D) |
| Exemples | ChronoUnit.DAYS | Period.of(2,5,3) |
| Prend en charge plusieurs champs | Non | Oui |
| Bon pour | Incréments simples | Incréments complexes |
| Fréquent avec | Toutes les classes date/heure | Restreint selon le type |
12.9.7 Méthodes between(...)
De nombreuses classes fournissent une méthode between via ChronoUnit, Duration ou Period.
Utiliser Duration.between (pour les classes basées sur le temps)
Duration d = Duration.between(
LocalTime.of(10, 0),
LocalTime.of(13, 30)
);
// PT3H30M
Utiliser Period.between (uniquement pour les dates)
Period p = Period.between(
LocalDate.of(2025, 3, 1),
LocalDate.of(2025, 5, 10)
);
// P2M9D
Utiliser ChronoUnit between
long days = ChronoUnit.DAYS.between(
LocalDate.of(2025, 3, 1),
LocalDate.of(2025, 3, 10)
);
// 9
Important
ChronoUnit.between(...) renvoie toujours un long,
tandis que Period.between renvoie une Period,
et Duration.between renvoie une Duration.
12.9.8 Pièges courants
- Appliquer le mauvais
TemporalAmount:
// LocalTime.plus(Period.ofDays(1)) // ❌ compile-time error
// LocalDate.plus(Duration.ofHours(1)) // ❌ runtime error: UnsupportedTemporalTypeException
- Changements DST avec
Duration: ajouter 24 heures n’est pas toujours “demain” dans une zone avec DST. Period.ofWeeks(1)fait exactement 7 jours ; les effets DST apparaissent lorsqu’il est appliqué à des types sensibles à la zone.Instant.plus(Period)→UnsupportedTemporalTypeExceptionà l’exécution ; utilisezDurationà la place.Instantne peut pas être créé directement depuis unLocalDateTime; vous devez d’abord appliquer une zone :ldt.atZone(zone).toInstant().
12.9.9 Résumé
| Fonctionnalité | TemporalUnit | TemporalAmount | ChronoUnit | Period | Duration |
|---|---|---|---|---|---|
| Représente | Une unité | Une quantité | enum d’unités | Y/M/J | S + nanos |
| Multi-champ | Non | Oui | Non | Oui | Non |
| Fonctionne avec | plus/minus | plus/minus | date/heure | LocalDate/LocalDateTime | Temps/zone |
| Basé sur l’humain | Non | Oui | Non | Oui | Non |
| Basé sur la machine | Oui | Oui | Oui | Non | Oui |