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.


