java.util.Date contre java.sql.Date

1. Vue d'ensemble

Dans ce tutoriel, nous allons comparer deux classes de dates: java.util.Date et java.sql.Date .

Une fois que nous avons terminé la comparaison, il devrait être clair lequel utiliser et pourquoi.

2. java.util.Date

La classe java.util.Date représente un moment particulier, avec une précision à la milliseconde depuis le 1er janvier 1970 00:00:00 GMT (heure de l'époque) . La classe est utilisée pour conserver le temps universel coordonné (UTC).

Nous pouvons l'initialiser de deux manières.

En appelant le constructeur:

Date date = new Date();

qui créera un nouvel objet de date avec l'heure définie sur l'heure actuelle, mesurée à la milliseconde près.

Ou en passant quelques millisecondes depuis l'époque:

long timestamp = 1532516399000; // 25 July 2018 10:59:59 UTC Date date = new Date(timestamp);

Notons que les autres constructeurs, présents avant Java 8, sont désormais obsolètes.

Cependant, Date a un certain nombre de problèmes et dans l'ensemble, son utilisation n'est plus recommandée .

C'est mutable. Une fois que nous l'avons initialisé, nous pouvons modifier sa valeur interne. Par exemple, nous pouvons appeler la méthode setTime :

date.setTime(0); // 01 January 1970 00:00:00

Pour en savoir plus sur les avantages des objets immuables, consultez cet article: Objets immuables en Java.

Il ne gère pas non plus très bien toutes les dates. Techniquement, il devrait refléter le temps universel coordonné (UTC). Cependant, cela dépend du système d'exploitation de l'environnement hôte.

La plupart des systèmes d'exploitation modernes utilisent 1 jour = 24h x 60m x 60s = 86400 secondes, ce qui, comme nous pouvons le voir, ne prend pas en compte la «seconde intercalaire».

Avec l'introduction de Java 8, le package java.time devrait être utilisé . Avant Java 8, une solution alternative était disponible - Joda Time .

3. java.sql.Date

Le java.sql.Date étend la classe java.util.Date .

Son objectif principal est de représenter SQL DATE, qui conserve des années, des mois et des jours. Aucune donnée de temps n'est conservée.

En fait, la date est stockée en millisecondes depuis le 1er janvier 1970 00:00:00 GMT et la partie heure est normalisée, c'est-à-dire mise à zéro.

Fondamentalement, c'est un wrapper autour de java.util.Date qui gère les exigences spécifiques à SQL. java.sql.Date ne doit être utilisé que lorsqu'il s'agit de bases de données.

Cependant, comme java.sql.Date ne contient pas d'informations sur le fuseau horaire, la conversion du fuseau horaire entre notre environnement local et le serveur de base de données dépend d'une implémentation du pilote JDBC. Cela ajoute un autre niveau de complexité.

Enfin, notons que pour prendre en charge d'autres types de données SQL: SQL TIME et SQL TIMESTAMP, deux autres classes java.sql sont disponibles: Time et Timestamp .

Ce dernier, même s'il s'étend de java.util.Date , prend en charge les nanosecondes.

4. Conclusion

La classe java.util.Date stocke une valeur date-heure en millisecondes depuis l'époque. java.sql.Date stocke une valeur de date uniquement et est couramment utilisé dans JDBC.

La gestion des dates est délicate. Nous devons nous souvenir des cas particuliers: secondes intercalaires , fuseaux horaires différents, etc. En traitant avec JDBC, nous pouvons utiliser java.sql.Date avec prudence.

Si nous allons utiliser java.util.Date, nous devons nous souvenir de ses lacunes. Si vous utilisez Java 8, mieux vaut ne pas utiliser du tout java.util.Date .