Java Date et heure
⚡ Résumé intelligent
Java La gestion des dates et des heures combine les classes héritées java.util.Date et SimpleDateFormat avec l'API moderne java.time introduite dans Java 8, offrant aux développeurs des types immuables et thread-safe pour un travail précis sur le calendrier.

Gestion des dates et des heures dans Java Il s'agit d'une étape courante de la création de la logique de planification, de l'horodatage des journaux, des rapports et des journaux d'audit. Avant d'écrire la moindre ligne de code, il est utile de connaître les paramètres qui composent une date :
- Le une année (en deux ou quatre chiffres).
- Le mois (sous forme de deux chiffres, sous forme des trois premières lettres du mois ou sous forme du nom complet du mois).
- Le données (le numéro du jour du mois).
- Le journée (le nom du jour à la date donnée, par exemple dim., lun., mar.).
Java Elle expose de nombreux autres paramètres qui décrivent un instant précis sur la chronologie, notamment l'ère, la semaine dans l'année, le fuseau horaire et le décalage. Les sections ci-dessous les détaillent chacune à l'aide d'exemples exécutables.
Afficher la date dans Java
Java fournit une Date classe dans le java.util Ce package contient une classe qui stocke un instant précis à la milliseconde près et propose des méthodes utilitaires pour afficher, comparer et formater cet instant. Pour obtenir la date et l'heure actuelles, instanciez la classe avec son constructeur par défaut :
import java.util.Date; class Date_Ex1 { public static void main(String args[]) { // Instantiate a Date object by invoking its constructor Date objDate = new Date(); // Display the Date and Time using toString() System.out.println(objDate.toString()); } }
Sortie :
Wed Nov 29 06:36:22 UTC 2017
L'exemple affiche la date au format par défaut de la fonction `toString`. Pour afficher la même date selon un format différent, il faut d'abord comprendre les caractères de formatage utilisés. Java les usages.
SimpleDateFormat : analyser et formater les dates
Le SimpleDateFormat classe dans java.text convertit un Date un objet dans une chaîne formatée et analyse une chaîne formatée pour la reconvertir en un DateIl utilise des lettres modèles qui correspondent à un composant de date ou d'heure. Le tableau ci-dessous répertorie toutes les lettres prises en charge :
| Lettre | Composant Date ou Heure | Exemple |
|---|---|---|
| G | Désignateur d'ère | AD |
| y | Année | 2026 |
| M | Mois dans l'année | Juillet ou juillet ou 07 |
| w | Semaine dans l'année | 27 |
| W | Semaine dans le mois | 2 |
| D | Jour dans l'année | 189 |
| d | Jour dans le mois | 10 |
| F | Jour de la semaine dans le mois | 2 |
| E | Nom du jour dans la semaine | mardi ou mardi |
| u | Jour numéro de la semaine (1 = Monday, 7 = dimanche) | 1 |
| a | Marqueur AM ou PM | PM |
| H | Heure dans la journée (0-23) | 0 |
| k | Heure dans la journée (1-24) | 24 |
| K | Heure en AM ou PM (0-11) | 0 |
| h | Heure en AM ou PM (1-12) | 12 |
| m | Minute en heure | 30 |
| s | Seconde en minute | 55 |
| S | Milliseconde | 978 |
| z | Fuseau horaire (nom) | Heure Standard du Pacifique; TVP; GMT-08:00 |
| Z | Fuseau horaire (décalage RFC 822) | - 0800 |
| X | Fuseau horaire (décalage ISO 8601) | -08 ou -0800 ou -08h00 |
Vous n'avez pas besoin de mémoriser l'intégralité du tableau. Consultez-le chaque fois que vous créez un nouveau motif.
Comment utiliser SimpleDateFormat
SimpleDateFormat est une sous-classe de DateFormat Cela vous permet de formater et d'analyser des dates à l'aide des lettres modèles ci-dessus. Combinez ces lettres pour définir la chaîne exacte que vous souhaitez produire ou lire.
Par exemple :
- Format de date requis : 2012.10.23/20/20 45:: PSTLe modèle de format approprié est :
yyyy.MM.dd HH:mm:ss zzz. - Format de date requis : 09:30:00 AM 23-May-2012Le modèle de format approprié est :
hh:mm:ss a dd-MMM-yyyy.
Astuce: Montrez la casse des lettres. Majuscules M est le mois, en minuscules m est minuscule. Majuscule H est une horloge de 24 heures, en minuscules h Il s'agit d'une horloge de 12 heures. Les confondre produit un résultat erroné sans que cela se produise.
Le programme ci-dessous affiche la date actuelle deux fois, une fois au format par défaut et une fois selon un modèle SimpleDateFormat :
import java.text.SimpleDateFormat; import java.util.Date; class TestDates_Format { public static void main(String args[]) { // Current system date and time is assigned to objDate Date objDate = new Date(); System.out.println(objDate); // Build the target pattern and format the date String strDateFormat = "hh:mm:ss a dd-MMM-yyyy"; SimpleDateFormat objSDF = new SimpleDateFormat(strDateFormat); System.out.println(objSDF.format(objDate)); } }
Sortie :
Wed Nov 29 06:31:41 UTC 2017 06:31:41 AM 29-Nov-2017
Exemple de comparaison de dates
La manière la plus fiable de commander deux Date les objets sont compareTo() Cette méthode renvoie un entier négatif si la date est antérieure, zéro si les deux dates sont identiques, et un entier positif si la date est postérieure. L'extrait de code ci-dessous analyse deux chaînes de dates et affiche leur ordre relatif :
import java.text.SimpleDateFormat; import java.text.ParseException; import java.util.Date; class TestDates_Compare { public static void main(String args[]) throws ParseException { SimpleDateFormat objSDF = new SimpleDateFormat("dd-MM-yyyy"); Date dt_1 = objSDF.parse("20-08-1981"); Date dt_2 = objSDF.parse("12-10-2012"); System.out.println("Date1 : " + objSDF.format(dt_1)); System.out.println("Date2 : " + objSDF.format(dt_2)); // compareTo returns > 0 when dt_1 is after dt_2 if (dt_1.compareTo(dt_2) > 0) { System.out.println("Date 1 occurs after Date 2"); } // compareTo returns < 0 when dt_1 is before dt_2 else if (dt_1.compareTo(dt_2) < 0) { System.out.println("Date 1 occurs before Date 2"); } // compareTo returns 0 when both dates are equal else { System.out.println("Both are the same date"); } } }
Sortie :
Date1 : 20-08-1981 Date2 : 12-10-2012 Date 1 occurs before Date 2
À noter: Le code original utilisait le modèle dd-mm-yyyy. Les minuscules mm La lettre « minute » correspond à la minute, et non au mois ; l’analyseur a donc généré silencieusement une valeur de mois incorrecte. La correction ci-dessus utilise les majuscules. MM pour le mois, ce qui correspond à la lettre modèle correcte.
Java 8 API moderne de date et d'heure (java.time)
Java 8 a introduit le java.time Ce package propose une API repensée, inspirée de la bibliothèque Joda-Time. Les nouvelles classes sont immuables, compatibles avec le multithreading et séparent le calendrier humain de la chronologie machine. Les types les plus courants sont :
LocalDatepour une date sans heure ni fuseau horaire (par exemple, un anniversaire).LocalTimepour une heure murale sans date ni fuseau horaire.LocalDateTimepour une date et une heure sans fuseau horaire.ZonedDateTimepour une date et une heure avec un fuseau horaire spécifique.OffsetDateTimepour une date et une heure avec un décalage UTC mais sans fuseau horaire nommé.Instantpour un horodatage machine mesuré à partir de l'époque UNIX.DurationetPeriodpour les montants basés sur le temps et sur la date.
L'exemple ci-dessous affiche la date, l'heure, l'horodatage et le fuseau horaire actuels à l'aide de l'API moderne :
import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZonedDateTime; import java.time.Instant; import java.time.ZoneId; class ModernDateDemo { public static void main(String args[]) { LocalDate today = LocalDate.now(); LocalDateTime now = LocalDateTime.now(); ZonedDateTime zoned = ZonedDateTime.now(ZoneId.of("Asia/Kolkata")); Instant epoch = Instant.now(); System.out.println("LocalDate : " + today); System.out.println("LocalDateTime : " + now); System.out.println("ZonedDateTime : " + zoned); System.out.println("Instant : " + epoch); } }
Chaque type possède des méthodes de fabrication (now, of, parse) et les opérations immuables (plusDays, minusHours, withYear) qui renvoient une nouvelle valeur au lieu de modifier l'objet d'origine.
DateTimeFormatter : Formater les dates en format moderne Java
DateTimeFormatter in java.time.format remplace SimpleDateFormatElle utilise le même style de lettres modèles, est immuable et peut être partagée en toute sécurité entre les threads sans synchronisation supplémentaire. La classe expose également des constantes prêtes à l'emploi telles que : ISO_LOCAL_DATE et ISO_ZONED_DATE_TIME pour les formats standard.
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; class FormatterDemo { public static void main(String args[]) { LocalDateTime now = LocalDateTime.now(); DateTimeFormatter iso = DateTimeFormatter.ISO_LOCAL_DATE_TIME; DateTimeFormatter human = DateTimeFormatter.ofPattern("hh:mm:ss a dd-MMM-yyyy"); System.out.println(now.format(iso)); System.out.println(now.format(human)); LocalDateTime parsed = LocalDateTime.parse("2026-07-04T09:30:00", iso); System.out.println("Parsed back : " + parsed); } }
Pour comparer deux dates dans l'API moderne, appelez isBefore, isAfter, isEqualCes méthodes sont plus claires que compareTo et travailler avec chaque java.time classe.
Sécurité des fils et meilleures pratiques pour Java Date et heure
Le java.util.Date et SimpleDateFormat antérieur à la concomitance moderne JavaChacune de ces méthodes présente des pièges connus. Suivez les bonnes pratiques ci-dessous pour garantir une gestion correcte des dates dans votre code de production :
- Privilégiez java.time à Date et Calendar. Les nouveaux types sont immuables et compatibles avec le multithreading, et ils modélisent le domaine avec plus de précision (dates sans heures, heures sans fuseaux horaires, etc.).
- Ne partagez pas un objet SimpleDateFormat entre plusieurs discussions. Cette classe stocke l'état d'analyse interne et n'est pas thread-safe. Enveloppez-la dans un
ThreadLocal, synchronisez sur l'instance ou passez àDateTimeFormatter. - Spécifiez toujours les paramètres régionaux. Les noms des mois et des jours varient selon les paramètres régionaux par défaut de la JVM, ce qui donne des résultats comme :
MMMetEEEnon portable. Indiquez explicitement les paramètres régionaux (par exemple,Locale.ENGLISH). - Indiquez clairement les fuseaux horaires.
LocalDateTimen'a pas de zone, donc convertir enZonedDateTimeorInstantchaque fois que le moment précis compte, notamment pour les journaux, les colonnes de bases de données et les charges utiles réseau. - Convertissez avec précaution entre les deux API. Utilisez le
date.toInstant(),Date.from(instant)etcalendar.toInstant().atZone(zone)à la frontière entre le code hérité et le code moderne. - Stocker les horodatages en UTC. Persister et transmit dates en UTC (un
Instantou une chaîne ISO 8601) et convertir dans la zone utilisateur uniquement lors de l'affichage.


