1. LocalDate : date sans heure ni fuseau horaire
LocalDate, c’est simplement une date. Sans heure, sans fuseau horaire, sans tracas superflus. Comme une page de calendrier : 2025-06-01, et c’est tout. Si vous ne vous souciez pas de l’instant exact de « minuit » selon les villes, et qu’il vous faut simplement « 1er juin 2025 », utilisez LocalDate.
Comment créer LocalDate ?
Il existe plusieurs façons, toutes simples et pratiques.
Date actuelle
import java.time.LocalDate;
LocalDate today = LocalDate.now();
System.out.println(today); // Par exemple, 2025-06-01
Date précise
LocalDate birthday = LocalDate.of(1990, 12, 15);
System.out.println(birthday); // 1990-12-15
Vous pouvez utiliser des nombres pour l’année, le mois et le jour. Le mois est un nombre de 1 à 12 (janvier = 1, décembre = 12).
Analyse depuis une chaîne
LocalDate parsedDate = LocalDate.parse("2025-06-01");
System.out.println(parsedDate); // 2025-06-01
La chaîne doit être au format yyyy-MM-dd. Si le format ne correspond pas, une exception sera levée.
Récupérer les composants d’une date
LocalDate propose des méthodes qui renvoient les différentes parties de la date :
int year = today.getYear(); // 2025
int month = today.getMonthValue(); // 6 (juin)
int day = today.getDayOfMonth(); // 1
System.out.println("Année : " + year + ", mois : " + month + ", jour : " + day);
Si vous voulez obtenir le mois en toutes lettres, utilisez la méthode getMonth() :
System.out.println(today.getMonth()); // JUNE
Et si vous avez besoin du jour de la semaine — utilisez la méthode getDayOfWeek() :
System.out.println(today.getDayOfWeek()); // SATURDAY
Exemple pratique
Poursuivons le développement de votre application console d’apprentissage : elle peut désormais souhaiter un joyeux anniversaire à l’utilisateur.
import java.time.LocalDate;
public class BirthdayApp {
public static void main(String[] args) {
LocalDate birthday = LocalDate.of(2000, 2, 29);
System.out.println("Date de naissance : " + birthday);
System.out.println("Jour de la semaine de naissance : " + birthday.getDayOfWeek());
}
}
2. LocalTime : heure sans date ni fuseau horaire
LocalTime, c’est simplement l’heure. Heures, minutes, secondes (et même nanosecondes). Mais sans date ! Si vous devez stocker, par exemple, « l’heure d’ouverture du magasin » ou « l’heure de début de la réunion » sans lien avec une date — c’est la classe qu’il vous faut.
Comment créer LocalTime ?
Heure actuelle
import java.time.LocalTime;
LocalTime now = LocalTime.now();
System.out.println(now); // Par exemple, 14:37:12.123456789
Heure précise
LocalTime lunchTime = LocalTime.of(13, 30); // 13:30:00
System.out.println(lunchTime);
Vous pouvez ajouter des secondes et des nanosecondes :
LocalTime precise = LocalTime.of(8, 15, 30, 123_000_000); // 08:15:30.123
System.out.println(precise);
Analyse depuis une chaîne
LocalTime parsedTime = LocalTime.parse("14:30:00");
System.out.println(parsedTime); // 14:30
Récupérer les composants de l’heure
int hour = now.getHour();
int minute = now.getMinute();
int second = now.getSecond();
System.out.println("Heures : " + hour + ", minutes : " + minute + ", secondes : " + second);
Exemple pratique
Ajoutons une « horloge » à notre application :
import java.time.LocalTime;
public class ClockApp {
public static void main(String[] args) {
LocalTime current = LocalTime.now();
System.out.println("Maintenant : " + current);
System.out.println("Heure : " + current.getHour());
System.out.println("Minute : " + current.getMinute());
}
}
3. LocalDateTime : date et heure sans fuseau horaire
LocalDateTime est un combo : date + heure, mais toujours sans fuseau horaire. Par exemple, « 2025-06-01 14:30:00 ». C’est pratique lorsque vous voulez stocker un moment sans vous soucier de l’endroit où il sera lu.
Comment créer LocalDateTime ?
Date et heure actuelles
import java.time.LocalDateTime;
LocalDateTime now = LocalDateTime.now();
System.out.println(now); // Par exemple, 2025-06-01T14:30:15.123456789
Date et heure précises
LocalDateTime meeting = LocalDateTime.of(2025, 6, 1, 14, 30);
System.out.println(meeting); // 2025-06-01T14:30
Vous pouvez ajouter des secondes et des nanosecondes :
LocalDateTime preciseMeeting = LocalDateTime.of(2025, 6, 1, 14, 30, 45, 123_000_000);
System.out.println(preciseMeeting); // 2025-06-01T14:30:45.123
Analyse depuis une chaîne
LocalDateTime parsed = LocalDateTime.parse("2025-06-01T14:30:00");
System.out.println(parsed); // 2025-06-01T14:30
Remarque : la lettre T sépare la date de l’heure selon la norme ISO.
Récupérer les composants
int year = now.getYear();
int month = now.getMonthValue();
int day = now.getDayOfMonth();
int hour = now.getHour();
int minute = now.getMinute();
System.out.println("Date : " + year + "-" + month + "-" + day + " Heure : " + hour + ":" + minute);
4. Opérations courantes sur les dates et les heures
Maintenant que nous savons créer des objets de date et d’heure, apprenons à faire quelque chose d’utile avec eux.
Addition et soustraction
Les trois classes (LocalDate, LocalTime, LocalDateTime) sont immuables. Cela signifie que des méthodes comme plusDays() ou minusMonths() renvoient un nouvel objet sans modifier l’original.
LocalDate
LocalDate today = LocalDate.now();
LocalDate tomorrow = today.plusDays(1);
LocalDate lastMonth = today.minusMonths(1);
System.out.println("Aujourd’hui : " + today);
System.out.println("Demain : " + tomorrow);
System.out.println("Il y a un mois : " + lastMonth);
LocalTime
LocalTime now = LocalTime.now();
LocalTime inTenMinutes = now.plusMinutes(10);
System.out.println("Maintenant : " + now);
System.out.println("Dans 10 minutes : " + inTenMinutes);
LocalDateTime
LocalDateTime start = LocalDateTime.of(2025, 6, 1, 14, 0);
LocalDateTime end = start.plusHours(2).minusMinutes(15);
System.out.println("Début : " + start);
System.out.println("Fin : " + end);
Comparaison des dates et des heures
Toutes ces classes possèdent les méthodes isBefore(), isAfter(), isEqual() :
LocalDate birthday = LocalDate.of(2000, 2, 29);
LocalDate today = LocalDate.now();
if (today.isAfter(birthday)) {
System.out.println("Vous êtes plus âgé que si vous veniez tout juste de naître !");
}
LocalTime morning = LocalTime.of(8, 0);
LocalTime now = LocalTime.now();
if (now.isBefore(morning)) {
System.out.println("Il est encore trop tôt pour se lever...");
} else {
System.out.println("Il est temps de se réveiller !");
}
Obtenir la date/l’heure actuelles
Comme vous l’avez déjà vu, les méthodes now() renvoient les valeurs actuelles :
LocalDate date = LocalDate.now();
LocalTime time = LocalTime.now();
LocalDateTime dateTime = LocalDateTime.now();
5. Pratique : exemples et exercices
Exemple 1 : jour de la semaine pour n’importe quelle date
import java.time.LocalDate;
public class DayOfWeekApp {
public static void main(String[] args) {
LocalDate anyDate = LocalDate.of(2025, 12, 31);
System.out.println("Le 31 décembre 2025 — c’est " + anyDate.getDayOfWeek());
}
}
Exemple 2 : combien de jours jusqu’au Nouvel An ?
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
public class DaysToNewYear {
public static void main(String[] args) {
LocalDate today = LocalDate.now();
LocalDate newYear = LocalDate.of(today.getYear() + 1, 1, 1);
long daysLeft = ChronoUnit.DAYS.between(today, newYear);
System.out.println("Il reste " + daysLeft + " jours avant le Nouvel An !");
}
}
Exemple 3 : vérifier si l’année est bissextile
import java.time.LocalDate;
public class LeapYearCheck {
public static void main(String[] args) {
LocalDate date = LocalDate.of(2025, 1, 1);
if (date.isLeapYear()) {
System.out.println(date.getYear() + " — année bissextile !");
} else {
System.out.println(date.getYear() + " — année ordinaire.");
}
}
}
Exemple 4 : différence entre deux heures
import java.time.LocalTime;
import java.time.Duration;
public class TimeDifference {
public static void main(String[] args) {
LocalTime start = LocalTime.of(9, 0);
LocalTime end = LocalTime.of(17, 30);
Duration duration = Duration.between(start, end);
System.out.println("La journée de travail dure " + duration.toHours() + " heures " +
(duration.toMinutes() % 60) + " minutes.");
}
}
6. Erreurs typiques
Erreur n° 1 : confondre LocalDateTime et ZonedDateTime.
LocalDateTime ne contient aucune information de fuseau horaire ! Si vous stockez des horaires de vols entre des pays ou des événements qui se déroulent dans différents fuseaux — utilisez ZonedDateTime, sinon vous risquez d’obtenir des résultats inattendus lors du transfert de données entre systèmes.
Erreur n° 2 : utiliser un format de chaîne incorrect pour l’analyse.
Par exemple, tenter d’analyser 01.06.2025 avec LocalDate.parse(). Par défaut, on attend le format 2025-06-01. Pour d’autres formats, il faut un DateTimeFormatter spécifique (nous verrons cela dans le prochain cours !).
Erreur n° 3 : penser que des méthodes comme plusDays() modifient l’objet.
Non ! Tous les objets sont immuables. La méthode renvoie un nouvel objet et l’ancien reste inchangé.
Erreur n° 4 : utiliser LocalTime pour stocker un instant absolu.
LocalTime ne sert qu’à l’heure locale de la journée. Si vous voulez conserver un « instant dans le temps », utilisez Instant ou ZonedDateTime.
Erreur n° 5 : oublier la numérotation des mois (1 = janvier, 12 = décembre).
Dans LocalDate.of(year, month, day), le mois commence à 1 (et non à 0, comme dans certains autres langages ou anciens API).
GO TO FULL VERSION