LocalDate Java : Comment Gérer les Dates Simplement ?
Vous avez du mal à gérer les dates en Java ? L’ancienne classe `Date` vous donne des maux de tête ? Vous cherchez une méthode moderne et fiable pour manipuler des dates simplement ?
Depuis Java 8, la classe LocalDate est la solution. Cet article vous montre exactement comment l’utiliser pour créer, modifier et formater des dates, avec des exemples de code clairs que vous pouvez utiliser tout de suite.
Qu’est-ce que la classe LocalDate en Java ?
La classe LocalDate fait partie de la nouvelle API java.time, introduite avec Java 8. Elle représente une date, et c’est tout. On y trouve juste l’année, le mois et le jour (format AAAA-MM-JJ). Il n’y a ni heure, ni minute, ni seconde, et surtout, pas de gestion de fuseau horaire.
Son avantage principal est son immutabilité. Ça veut dire qu’un objet `LocalDate` ne peut jamais être modifié après sa création. Chaque fois que vous faites une opération, comme ajouter un jour, l’API ne change pas l’objet original. Elle retourne une nouvelle instance avec la date mise à jour. C’est un gain de sécurité énorme : vous évitez les bugs où une date est modifiée par erreur dans une autre partie de votre code. Grâce à ça, la classe est entièrement thread-safe. C’est une nette amélioration par rapport à l’ancienne classe java.util.Date, qui était mutable et compliquée.
3 Façons de Créer une Instance de LocalDate
Pour commencer à travailler avec `LocalDate`, il faut d’abord en créer un objet. Il y a trois méthodes principales pour ça, chacune adaptée à un besoin différent.
1. Obtenir la date actuelle avec LocalDate.now()
C’est la méthode la plus simple pour avoir la date du jour. La méthode statique `now()` utilise l’horloge du système pour retourner la current date. C’est l’équivalent de `new Date()` mais pour la classe `LocalDate`.
// Obtenir la date actuelle du système
LocalDate today = LocalDate.now();
System.out.println("Date actuelle : " + today);
// Affiche (par exemple) : Date actuelle : 2024-10-27
Bon à savoir : Il existe une autre version, `public static LocalDate now(ZoneId zone)`, qui permet de récupérer la date actuelle dans un fuseau horaire spécifique si votre application doit gérer des contextes internationaux.
2. Créer une date spécifique avec LocalDate.of()
Si vous connaissez déjà l’année, le mois et le jour, la méthode `of()` est la plus directe. Elle prend trois entiers en arguments : year, month, and day. C’est très clair et ça évite les ambiguïtés des anciens constructeurs.
// Créer une date spécifique (26 octobre 2025)
LocalDate specificDate = LocalDate.of(2025, 10, 26);
System.out.println("Date spécifique : " + specificDate);
// Affiche : Date spécifique : 2025-10-26
3. « Parser » une chaîne de caractères avec LocalDate.parse()
Très souvent, on reçoit des dates sous forme de texte (String). La méthode `parse()` permet de convertir ce texte en objet `LocalDate`. Par défaut, elle s’attend au format standard ISO 8601, c’est-à-dire `AAAA-MM-JJ`.
// Créer une date à partir d'un String
String dateString = "2025-12-31";
LocalDate fromString = LocalDate.parse(dateString);
System.out.println("Date depuis un String : " + fromString);
// Affiche : Date depuis un String : 2025-12-31
Manipuler et Interroger une LocalDate : Le Tableau des Méthodes Utiles
Une fois votre objet `LocalDate` créé, vous pouvez facilement le manipuler ou en extraire des informations. L’API `java.time.LocalDate` propose des méthodes aux noms très explicites. Voici les plus courantes.
| Méthode | Ce qu’elle fait | Exemple court |
|---|---|---|
| plusDays(long daysToAdd) | Ajoute un certain nombre de jours. | date.plusDays(10); |
| plusWeeks(long weeksToAdd) | Ajoute un certain nombre de semaines. | date.plusWeeks(2); |
| plusMonths(long monthsToAdd) | Ajoute un certain nombre de mois. | date.plusMonths(3); |
| plusYears(long yearsToAdd) | Ajoute un certain nombre d’années. | date.plusYears(1); |
| minusDays/Weeks/Months/Years | Soustrait jours, semaines, mois ou années. | date.minusMonths(6); |
| getDayOfMonth() | Retourne le jour du mois (1-31). | int day = date.getDayOfMonth(); |
| getMonth() | Retourne le mois (enum `Month`). | Month month = date.getMonth(); |
| getYear() | Retourne l’année. | int year = date.getYear(); |
| getDayOfWeek() | Retourne le jour de la semaine (enum `DayOfWeek`). | DayOfWeek day = date.getDayOfWeek(); |
| isLeapYear() | Vérifie si c’est une année bissextile. | boolean leap = date.isLeapYear(); |
Ajouter ou soustraire du temps (plus/minus)
Les méthodes de manipulation comme plusDays() ou minusMonths() sont très pratiques. Comme `LocalDate` est immuable, chaque appel retourne un nouvel objet. Vous pouvez donc enchaîner les appels pour des calculs complexes.
LocalDate date = LocalDate.of(2024, 8, 15);
// Ajouter 2 semaines et soustraire 1 jour
LocalDate result = date.plusWeeks(2).minusDays(1);
System.out.println("Date de départ : " + date); // Affiche : 2024-08-15
System.out.println("Date calculée : " + result); // Affiche : 2024-08-28
Extraire des informations spécifiques (get)
Vous avez souvent besoin d’une partie spécifique de la date, comme le jour de la semaine ou le numéro du mois. Les méthodes `get…()` servent à ça et rendent le code très lisible.
LocalDate date = LocalDate.of(2025, 12, 25);
int year = date.getYear(); // 2025
java.time.Month month = date.getMonth(); // DECEMBER
int dayOfMonth = date.getDayOfMonth(); // 25
java.time.DayOfWeek dayOfWeek = date.getDayOfWeek(); // THURSDAY
System.out.println("Le " + dayOfMonth + " " + month + " " + year + " sera un " + dayOfWeek);
Comment Comparer Deux LocalDate ?
Comparer des dates est une opération courante. La classe `LocalDate` fournit des méthodes simples pour savoir si une date est avant, après ou égale à une autre. Fini les comparaisons compliquées.
Les trois méthodes principales sont :
- isBefore() : retourne `true` si la date est avant celle passée en paramètre.
- isAfter() : retourne `true` si la date est après celle passée en paramètre.
- equals() : retourne `true` si les deux dates sont exactement les mêmes (même jour, mois et année).
LocalDate date1 = LocalDate.of(2024, 11, 20);
LocalDate date2 = LocalDate.of(2025, 1, 15);
LocalDate date3 = LocalDate.of(2024, 11, 20);
// date1 est-elle avant date2 ?
boolean isBefore = date1.isBefore(date2);
System.out.println("date1 before date2 : " + isBefore); // Affiche : true
// date2 est-elle après date1 ?
boolean isAfter = date2.isAfter(date1);
System.out.println("date2 after date1 : " + isAfter); // Affiche : true
// date1 est-elle égale à date3 ?
boolean isEqual = date1.equals(date3);
System.out.println("date1 equals date3 : " + isEqual); // Affiche : true
Formater LocalDate en String (et Vice Versa)
Le format par défaut `AAAA-MM-JJ` est pratique pour les développeurs, mais les utilisateurs préfèrent souvent des formats comme `JJ/MM/AAAA`. La classe DateTimeFormatter est l’outil parfait pour passer de l’un à l’autre.
De LocalDate vers String : formater la date
Pour convertir un object `LocalDate` en `String` avec un format personnalisé, vous devez créer un `DateTimeFormatter` avec le pattern de votre choix, puis utiliser la méthode `format()` de votre date.
LocalDate date = LocalDate.now(); // ex: 2024-10-27
// Créer un formatter pour le format "jour/mois/année"
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
// Appliquer le format
String formattedDate = date.format(formatter);
System.out.println("Date formatée : " + formattedDate); // Affiche : 27/10/2024
De String vers LocalDate : parser la date
Pour l’opération inverse, c’est-à-dire convertir une `String` avec un format spécifique en `LocalDate`, on utilise la méthode `LocalDate.parse()` en lui fournissant la chaîne de caractères et le formatter correspondant.
String dateInString = "26/10/2025";
// Le formatter doit correspondre exactement au format du String
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
// Parser le String pour obtenir un objet LocalDate
LocalDate parsedDate = LocalDate.parse(dateInString, formatter);
System.out.println("Date parsée : " + parsedDate); // Affiche : 2025-10-26
Le DateTimeFormatter est très puissant et permet de gérer de nombreux formats de date and time. C’est la méthode recommandée pour toutes les opérations de formatage avec le package java.time.
LocalDate vs LocalDateTime vs ZonedDateTime : Lequel Choisir ?
Le package `java.time` contient plusieurs classes pour gérer le temps. Il est important de choisir la bonne pour ne pas compliquer votre code inutilement. Voici un résumé simple pour vous aider.
| Classe | Ce qu’elle représente | Cas d’usage typique |
|---|---|---|
| LocalDate | Une date sans heure ni fuseau horaire. | Date de naissance, date de publication d’un article. |
| LocalDateTime | Une date avec une heure, mais sans fuseau horaire. | Un rendez-vous dans un agenda local, l’heure d’un événement. |
| ZonedDateTime | Une date avec heure et fuseau horaire. | Horaire d’un vol international, un meeting entre plusieurs pays. |
En résumé : utilisez LocalDate quand seule la date compte. Si vous avez besoin de l’heure, passez à la classe LocalDateTime. Et si le fuseau horaire est crucial (ce qui est souvent le cas pour les applications serveur), alors ZonedDateTime est la seule bonne option.
FAQ – Questions Fréquentes sur Java LocalDate
Q1 : Quelle est la principale différence entre LocalDate et l’ancienne classe java.util.Date ?
La différence majeure tient en trois points : LocalDate est immuable (plus sûr), ne gère ni l’heure ni le fuseau horaire (plus simple pour les dates pures), et son API est beaucoup plus claire (méthodes comme `plusYears()` au lieu de manipulations complexes).
Q2 : LocalDate est-elle thread-safe ?
Oui, totalement thread-safe. Comme tous les objets de la classe `LocalDate` sont immuables, ils peuvent être partagés sans risque entre plusieurs threads dans une application concurrente.
Q3 : Comment LocalDate gère les années bissextiles ?
Automatiquement. L’API `java.time` gère correctement les règles du calendrier grégorien, y compris les années bissextiles. Par exemple, `LocalDate.of(2024, 2, 29)` est une date valide, mais `LocalDate.of(2025, 2, 29)` lèvera une exception.
Q4 : Comment convertir un LocalDate en java.sql.Date pour une base de données ?
C’est très simple. La classe `java.sql.Date` possède une méthode statique `valueOf()` qui accepte un `LocalDate` en argument. C’est la méthode recommandée pour l’intégration avec JDBC. Exemple : java.sql.Date sqlDate = java.sql.Date.valueOf(myLocalDate);
Découvrez nos formations complètes
Téléchargez notre brochure pour explorer en détail nos programmes de formation, nos méthodes pédagogiques et les compétences que vous allez acquérir.
Obtenir la brochure