Introduction à la gestion des dates et heures en Java
La gestion des dates et des heures est l'une des tâches les plus courantes en développement. Qu'il s'agisse de journalisation d'événements, de calcul d'échéances, de filtrage de données ou d'affichage de calendrier, une maîtrise solide des API temporelles est indispensable. En Java, les classes java.util.Date et java.util.Calendar ont été utilisées pendant longtemps, mais elles présentaient de nombreux inconvénients : mutabilité, API non intuitive, problèmes de concurrence.
À partir de Java 8, un nouveau package java.time a été ajouté au langage, basé sur la norme ISO-8601. Il propose des classes immutables (immuables) et thread-safe, bien plus pratiques à utiliser. Dans cet article, nous aborderons à la fois les anciennes et les nouvelles approches, et montrerons des exemples de code pratiques.
1. Classes obsolètes : Date et Calendar
Bien que l'utilisation de Date et Calendar ne soit pas recommandée dans les nouveaux projets, vous pouvez les rencontrer dans du code legacy. Examinons les points principaux.
La classe java.util.Date
La classe Date représente un instant précis avec une précision à la milliseconde. Elle possède de nombreuses méthodes obsolètes.
import java.util.Date;
public class DateExample { public static void main(String[] args) { // Date et heure actuelles Date now = new Date(); System.out.println("Heure actuelle : " + now);
// Constructeur avec millisecondes (depuis le 1er janvier 1970) Date specificDate = new Date(1000000000000L); System.out.println("Date : " + specificDate);
// Comparaison de dates boolean after = now.after(specificDate); System.out.println("now après specificDate ? " + after); }}La classe java.util.Calendar
Calendar est une classe plus flexible, mais toujours peu pratique pour la manipulation des dates.
import java.util.Calendar;
public class CalendarExample { public static void main(String[] args) { Calendar cal = Calendar.getInstance(); // Définition d'une date spécifique cal.set(2025, Calendar.MARCH, 15, 10, 30, 0); System.out.println("Date définie : " + cal.getTime());
// Obtention de champs individuels int year = cal.get(Calendar.YEAR); int month = cal.get(Calendar.MONTH) + 1; // Les mois commencent à 0 int day = cal.get(Calendar.DAY_OF_MONTH); System.out.println("Année : " + year + ", Mois : " + month + ", Jour : " + day);
// Ajout de jours cal.add(Calendar.DAY_OF_MONTH, 10); System.out.println("Dans 10 jours : " + cal.getTime()); }}Inconvénients : mutabilité (les méthodes modifient l'objet lui-même), complexité de gestion des fuseaux horaires, confusion avec les indices des mois.
2. API moderne : java.time (Java 8+)
Le package java.time résout tous les problèmes des anciennes classes. Les classes principales sont :
- LocalDate — date sans heure (année, mois, jour) ;
- LocalTime — heure sans date (heures, minutes, secondes, nanosecondes) ;
- LocalDateTime — date et heure sans fuseau horaire ;
- ZonedDateTime — date et heure avec fuseau horaire ;
- Instant — instant en UTC ;
- Duration et Period — pour travailler avec des intervalles de temps.
LocalDate — travail avec les dates
import java.time.LocalDate;import java.time.Month;
public class LocalDateExample { public static void main(String[] args) { // Date actuelle LocalDate today = LocalDate.now(); System.out.println("Aujourd'hui : " + today);
// Date spécifique LocalDate specific = LocalDate.of(2025, Month.DECEMBER, 25); System.out.println("Noël : " + specific);
// Ajout de jours LocalDate nextWeek = to