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.

  • (I.e. Date d'hรฉritage : La classe java.util.Date stocke un instant en millisecondes et affiche une chaรฎne de caractรจres par dรฉfaut via la mรฉthode toString.
  • ๐Ÿ”ค Lettres modรจles : SimpleDateFormat utilise des lettres telles que yyyy, MM, dd, HH, mm, ss et zzz pour dรฉfinir des formats de sortie personnalisรฉs.
  • ๏ธ Comparaison: La mรฉthode compareTo renvoie un entier nรฉgatif, nul ou positif pour ordonner deux instances de Date par ordre chronologique.
  • (I.e. API moderne : LocalDate, LocalDateTime, ZonedDateTime et Instant dans java.time remplacent Date et Calendar par des objets immuables.
  • ๐Ÿงต Sรฉcuritรฉ du fil : DateTimeFormatter est immuable et peut รชtre partagรฉ en toute sรฉcuritรฉ, tandis que SimpleDateFormat nรฉcessite une synchronisation ou un wrapper ThreadLocal.
  • (I.e. Interopรฉrabilitรฉ: Convertissez entre les anciennes et les nouvelles API ร  l'aide des fonctions d'assistance Date.toInstant, Date.from et Calendar.toInstant.

Java Date et heure

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.

Comment utiliser la date dans Java

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 :

LettreComposant Date ou HeureExemple
GDรฉsignateur d'รจreAD
yAnnรฉe2026
MMois dans l'annรฉeJuillet ou juillet ou 07
wSemaine dans l'annรฉe27
WSemaine dans le mois2
DJour dans l'annรฉe189
dJour dans le mois10
FJour de la semaine dans le mois2
ENom du jour dans la semainemardi ou mardi
uJour numรฉro de la semaine (1 = Monday, 7 = dimanche)1
aMarqueur AM ou PMPM
HHeure dans la journรฉe (0-23)0
kHeure dans la journรฉe (1-24)24
KHeure en AM ou PM (0-11)0
hHeure en AM ou PM (1-12)12
mMinute en heure30
sSeconde en minute55
SMilliseconde978
zFuseau horaire (nom)Heure Standard du Pacifique; TVP; GMT-08:00
ZFuseau horaire (dรฉcalage RFC 822)- 0800
XFuseau 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 :

  1. Format de date requis : 2012.10.23/20/20 45:: PSTLe modรจle de format appropriรฉ est : yyyy.MM.dd HH:mm:ss zzz.
  2. 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

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 :

  • LocalDate pour une date sans heure ni fuseau horaire (par exemple, un anniversaire).
  • LocalTime pour une heure murale sans date ni fuseau horaire.
  • LocalDateTime pour une date et une heure sans fuseau horaire.
  • ZonedDateTime pour une date et une heure avec un fuseau horaire spรฉcifique.
  • OffsetDateTime pour une date et une heure avec un dรฉcalage UTC mais sans fuseau horaire nommรฉ.
  • Instant pour un horodatage machine mesurรฉ ร  partir de l'รฉpoque UNIX.
  • Duration et Period pour 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 : MMM et EEE non portable. Indiquez explicitement les paramรจtres rรฉgionaux (par exemple, Locale.ENGLISH).
  • Indiquez clairement les fuseaux horaires. LocalDateTime n'a pas de zone, donc convertir en ZonedDateTime or Instant chaque 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) et calendar.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 Instant ou une chaรฎne ISO 8601) et convertir dans la zone utilisateur uniquement lors de l'affichage.

FAQ

Utilisez LocalDateTime.now() du package java.time pour obtenir une date et une heure dans le fuseau horaire systรจme, ou LocalDate.now() pour obtenir uniquement une date. Sur les versions plus anciennes Java, utilisez new java.util.Date() pour obtenir l'instant actuel.

La classe `java.util.Date` reprรฉsente un instant en millisecondes depuis l'รฉpoque Unix et est mutable. La classe `LocalDate` modรฉlise une date calendaire sans heure ni fuseau horaire, est immuable et thread-safe, et offre des mรฉthodes plus claires telles que `plusDays` et `isBefore`.

Non. SimpleDateFormat conserve un รฉtat d'analyse modifiable et produit des rรฉsultats incorrects lorsqu'il est partagรฉ entre plusieurs threads. Encapsulez-le dans un ThreadLocal, synchronisez-le sur l'instance ou utilisez DateTimeFormatter, qui est immuable et sรปr.

Saisissez la chaรฎne exacte ยซ yyyy-MM-dd ยป. MM (en majuscules) reprรฉsente le mois, mm (en minuscules) les minutes. Pour une date et une heure complรจtes, utilisez ยซ yyyy-MM-dd HH:mm:ss ยป. Spรฉcifiez toujours les paramรจtres rรฉgionaux afin que les noms des mois restent identiques.

Avec les objets Date hรฉritรฉs, utilisez `compareTo` qui renvoie un entier nรฉgatif, nul ou positif. Avec `java.time`, appelez `isBefore`, `isAfter` ou `isEqual` sur un `LocalDate` ou un `Instant`. Les deux mรฉthodes respectent l'ordre chronologique.

Appelez `date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()`. Pour revenir ร  une date antรฉrieure, utilisez `Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant())`. Spรฉcifiez explicitement le fuseau horaire lorsque l'heure exacte est importante.

Les modรจles d'IA entraรฎnรฉs sur des corpus de journaux et de documents dรฉduisent le modรจle probable ร  partir d'exemples de chaรฎnes de caractรจres et renvoient un format de date et d'heure correspondant. Les classificateurs d'apprentissage automatique signalent รฉgalement les champs ambigus, tels que l'ordre mois-jour ou jour-mois.

Oui. GitHub Copilot suggรจre des modรจles DateTimeFormatter, des conversions ZonedDateTime, et JUnit tests pour la sortie sensible aux paramรจtres rรฉgionaux. RevVeuillez vรฉrifier chaque suggestion pour vous assurer de la correspondance correcte des lettres, des paramรจtres rรฉgionaux et du fuseau horaire avant de valider.

Rรฉsumez cet article avec :