Introduction au travail avec les dates et l'heure en Java
Travailler avec les dates et l'heure est l'une des tâches les plus courantes dans le développement d'applications. Java fournit des outils puissants à cet effet. Pendant longtemps, la classe principale était java.util.Date, mais elle présentait de sérieux inconvénients : mutabilité, confusion avec les mois (commençant à 0) et absence de support des fuseaux horaires. Avec la sortie de Java 8, la situation a radicalement changé — une nouvelle Date/Time API (package java.time) est apparue, qui est thread-safe, immuable et intuitive. Dans cet article, nous aborderons les deux approches, mais nous mettrons l'accent sur l'API moderne.
1. Legacy API : Date et Calendar
Bien qu'il ne soit pas recommandé d'utiliser les anciennes classes dans du nouveau code, vous pouvez les rencontrer dans des projets legacy. Examinons les points principaux.
Classe Date
La classe java.util.Date représente un moment précis dans le temps avec une précision à la milliseconde. Elle possède de nombreuses méthodes obsolètes.
import java.util.Date;
public class LegacyDateExample { public static void main(String[] args) { // Date et heure actuelles Date now = new Date(); System.out.println("Date actuelle : " + now);
// Date en millisecondes (depuis le 1er janvier 1970) Date specificDate = new Date(1000000000000L); System.out.println("Date selon le timestamp : " + specificDate);
// Comparaison de dates Date earlier = new Date(0); boolean isBefore = earlier.before(now); // true System.out.println("Plus tôt ? " + isBefore); }}Classe Calendar
java.util.Calendar est un outil plus flexible mais lourd. Il permet de manipuler les champs de date.
import java.util.Calendar;
public class CalendarExample { public static void main(String[] args) { Calendar cal = Calendar.getInstance(); // Définition d'une date spécifique : 25 décembre 2024 cal.set(2024, Calendar.DECEMBER, 25, 10, 30, 0); System.out.println("Date : " + cal.getTime());
// Ajout de 2 semaines cal.add(Calendar.WEEK_OF_YEAR, 2); System.out.println("Dans 2 semaines : " + cal.getTime());
// Obtention de champs individuels int dayOfMonth = cal.get(Calendar.DAY_OF_MONTH); int month = cal.get(Calendar.MONTH) + 1; // +1, car janvier = 0 System.out.println("Jour : " + dayOfMonth + ", Mois : " + month); }}Inconvénients : mutabilité (la méthode add modifie l'objet d'origine), complexité du formatage, confusion avec les fuseaux horaires.
2. Date/Time API moderne (Java 8+)
Le package java.time inclut les classes clés : LocalDate, LocalTime, LocalDateTime, ZonedDateTime, Instant et d'autres. Toutes sont immuables et thread-safe.
LocalDate — travail avec la date
Stocke une date sans heure ni fuseau horaire (année, mois, jour).
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 newYear = LocalDate.of(2025, Month.JANUARY, 1); System.out.println("Nouvel an : " + newYear);
// Arithmétique des dates LocalDate nextWeek = today.plusWeeks(1); LocalDate lastMonth = today.minusMonths(1); System.out.println("Dans une semaine : " + nextWeek); System.out.println("Il y a un mois : " + lastMonth);
// Comparaison boolean isAfter = today.isAfter(newYear); // false System.out.println("Aujourd'hui est après le Nouvel an ? " + isAfter); }}LocalTime — travail avec l'heure
Stocke l'heure (heure,