L’API Date et Heure est l’une des plus grandes fonctionnalités de la version Java 8. Java manquait d’une approche cohérente pour les dates et heures depuis le début, et l’API Date et Heure de Java 8 est un ajout bienvenu aux API Java de base.
Pourquoi avons-nous besoin de la nouvelle API Java Date et Heure ?
Avant de commencer à examiner l’API Date et Heure de Java 8, voyons pourquoi nous avons besoin d’une nouvelle API pour cela. Il y a eu plusieurs problèmes avec les classes de date et d’heure existantes en Java, certains d’entre eux sont les suivants :
- Les classes Java Date et Heure ne sont pas définies de manière cohérente, nous avons la classe Date à la fois dans les packages java.util et java.sql. De plus, les classes de formatage et d’analyse sont définies dans le package java.text.
- java.util.Date contient à la fois des valeurs de date et d’heure alors que java.sql.Date ne contient que des valeurs de date. Avoir cela dans le package java.sql n’a aucun sens. De plus, les deux classes ont le même nom, ce qui est une conception très mauvaise en soi.
- Il n’y a pas de classes clairement définies pour le temps, le timestamp, le formatage et l’analyse. Nous avons la classe abstraite java.text.DateFormat pour les besoins d’analyse et de formatage. Habituellement, la classe SimpleDateFormat est utilisée pour l’analyse et le formatage.
- Toutes les classes Date sont mutables, donc elles ne sont pas thread-safe. C’est l’un des plus gros problèmes avec les classes Date et Calendar de Java.
- La classe Date ne fournit pas d’internationalisation, il n’y a pas de support de fuseau horaire. C’est pourquoi les classes java.util.Calendar et java.util.TimeZone ont été introduites, mais elles présentent également tous les problèmes énumérés ci-dessus.
Il existe d’autres problèmes avec les méthodes définies dans les classes Date et Calendar, mais les problèmes ci-dessus montrent clairement qu’une API Date Time robuste était nécessaire en Java. C’est pourquoi Joda Time a joué un rôle clé en tant que remplacement de qualité pour les besoins de Date Time en Java.
Principes de conception de Java 8 Date Time
L’API Java 8 Date Time est une implémentation de JSR-310. Elle est conçue pour surmonter tous les défauts des implémentations de date et heure héritées. Certains des principes de conception de la nouvelle API Date Time sont les suivants :
-
Immutabilité: Toutes les classes de la nouvelle API Date-Time sont immuables et adaptées aux environnements multi-threads.
-
Séparation des préoccupations: La nouvelle API sépare clairement entre la date et l’heure lisibles par l’homme et le temps machine (horodatage Unix). Elle définit des classes séparées pour Date, Time, DateTime, Timestamp, Timezone, etc.
-
Clarté: Les méthodes sont clairement définies et effectuent la même action dans toutes les classes. Par exemple, pour obtenir l’instance actuelle, nous avons la méthode now(). Il y a des méthodes format() et parse() définies dans toutes ces classes plutôt que d’avoir une classe séparée pour elles.
Toutes les classes utilisent le patron de conception Factory et le patron de conception Strategy pour une meilleure gestion. Une fois que vous avez utilisé les méthodes dans l’une des classes, travailler avec d’autres classes ne sera pas difficile.
-
Opérations utilitaires: Toutes les nouvelles classes API de date-heure sont accompagnées de méthodes pour effectuer des tâches courantes, telles que l’ajout, la soustraction, le formatage, l’analyse, l’obtention de la partie séparée dans la date/heure, etc.
-
Extensible: La nouvelle API Date Heure fonctionne sur le système de calendrier ISO-8601 mais nous pouvons également l’utiliser avec d’autres calendriers non ISO.
Forfaits API Date Heure
Java 8 Date Heure API se compose des forfaits suivants.
- java.time: Il s’agit du forfait de base de la nouvelle API Date Heure Java. Toutes les principales classes de base font partie de ce forfait, telles que LocalDate, LocalTime, LocalDateTime, Instant, Period, Duration, etc. Toutes ces classes sont immuables et thread-safe. La plupart du temps, ces classes seront suffisantes pour gérer les exigences courantes.
- java.time.chrono: Ce forfait définit des API génériques pour les systèmes de calendrier non ISO. Nous pouvons étendre la classe AbstractChronology pour créer notre propre système de calendrier.
- java.time.format: Ce package contient des classes utilisées pour le formatage et l’analyse des objets date-heure. La plupart du temps, nous ne les utilisons pas directement car les classes principales du package java.time fournissent des méthodes de formatage et d’analyse.
- java.time.temporal: Ce package contient des objets temporels et nous pouvons l’utiliser pour trouver des dates ou heures spécifiques liées aux objets date/heure. Par exemple, nous pouvons les utiliser pour trouver le premier ou le dernier jour du mois. Vous pouvez facilement identifier ces méthodes car elles ont toujours le format « withXXX ».
- Package java.time.zone: Ce package contient des classes pour prendre en charge les différents fuseaux horaires et leurs règles.
Exemples de classes de l’API de date et heure Java 8
Nous avons examiné la plupart des parties importantes de l’API de date et heure Java. Il est maintenant temps d’examiner les classes les plus importantes de l’API de date et heure avec des exemples.
1. LocalDate
LocalDate est une classe immuable qui représente une date avec le format par défaut yyyy-MM-dd. Nous pouvons utiliser la méthode now() pour obtenir la date actuelle. Nous pouvons également fournir des arguments d’entrée pour l’année, le mois et le jour pour créer une instance de LocalDate.
Cette classe fournit une méthode surchargée pour now() où nous pouvons passer ZoneId pour obtenir des dates dans un fuseau horaire spécifique. Cette classe fournit la même fonctionnalité que java.sql.Date.
Des explications sur les méthodes de LocalDate sont fournies dans les commentaires. Lorsque nous exécutons ce programme, nous obtenons la sortie suivante.
2. LocalTime
LocalTime est une classe immuable dont l’instance représente une heure au format lisible par l’homme. Son format par défaut est hh:mm:ss.zzz. Tout comme LocalDate, cette classe prend en charge les fuseaux horaires et permet de créer une instance en passant les heures, les minutes et les secondes en tant qu’arguments d’entrée.
Sortie :
3. LocalDateTime
LocalDateTime est un objet date-heure immuable qui représente une date-heure avec le format par défaut yyyy-MM-dd-HH-mm-ss.zzz. Il fournit une méthode de fabrique qui prend en entrée des arguments LocalDate et LocalTime pour créer une instance de LocalDateTime.
Dans tous les trois exemples, nous avons vu que si nous fournissons des arguments non valides pour la création de Date/Heure, alors cela lance une java.time.DateTimeException, qui est une RuntimeException donc nous n’avons pas besoin de l’attraper explicitement.
Nous avons également constaté que nous pouvons obtenir des données de date/heure en passant ZoneId, vous pouvez obtenir la liste des valeurs ZoneId prises en charge depuis sa JavaDoc. Lorsque nous exécutons la classe ci-dessus, nous obtenons la sortie suivante.
4. Instantané
La classe Instantané est utilisée pour travailler avec un format de temps lisible par machine. Instantané stocke la date et l’heure au format de timestamp UNIX.
Sortie :
Utilitaires API de Date Java 8
La plupart des classes de principes de date et d’heure fournissent diverses méthodes utilitaires telles que plus/moins jours, semaines, mois, etc. Il existe d’autres méthodes utilitaires pour ajuster la date en utilisant TemporalAdjuster
et pour calculer la période entre deux dates.
Sortie:
Java 8 Analyse et Formatage des Dates
Il est très courant de formater une date dans différents formats, puis de convertir une chaîne en objets Date Time.
Sortie:
Support de date et heure hérité de l’API Java
Les classes de date/heure héritées sont utilisées dans presque toutes les applications, donc avoir une compatibilité ascendante est indispensable. C’est pourquoi il existe plusieurs méthodes utilitaires permettant de convertir les classes héritées en nouvelles classes et vice versa.
Sortie:
Comme vous pouvez le voir, les méthodes toString() des classes héritées TimeZone et GregorianCalendar sont trop verbeuses et peu conviviales pour l’utilisateur.
Conclusion
I like this new Date Time API a lot. Some of the most used classes will be LocalDate and LocalDateTime. It’s very easy to work with the new classes. And, having similar methods that does a particular job makes it easy to find. It will take some time from moving legacy classes to new Date Time classes, but I believe it will be worth the time and effort.
Source:
https://www.digitalocean.com/community/tutorials/java-8-date-localdate-localdatetime-instant