Obtenir la date actuelle avant Java 8

1. Introduction

Dans les systèmes hérités, nous pouvons avoir besoin de travailler avec des dates lorsque ni la nouvelle API de date et d'heure ni la bibliothèque Joda-Time hautement recommandée ne sont disponibles.

Dans ce court didacticiel, nous allons examiner plusieurs approches pour voir comment obtenir la date actuelle dans les systèmes pré-Java 8 .

2. Heure système

Lorsque tout ce dont nous avons besoin est une valeur numérique unique représentant la date et l'heure actuelles, nous pouvons utiliser l'heure système. Pour obtenir le nombre de millisecondes écoulées depuis le 1er janvier 1970 00:00:00 GMT, nous pouvons utiliser la méthode currentTimeMillis qui renvoie un long :

long elapsedMilliseconds = System.currentTimeMillis();

Lorsque nous voulons mesurer le temps écoulé avec une plus grande précision, nous pouvons utiliser la méthode nanoTime . Cela renverra la valeur des nanosecondes qui se sont écoulées depuis un moment fixe mais arbitraire.

Ce temps arbitraire est le même pour tous les appels à l'intérieur de la JVM, donc la valeur renvoyée n'est utile que pour calculer la différence en nanosecondes écoulées entre plusieurs appels de nanoTime :

long elapsedNanosecondsStart = System.nanoTime(); long elapsedNanoseconds = System.nanoTime() - elapsedNanosecondsStart;

3. Le package java.util

En utilisant les classes du package java.util , nous pouvons représenter un moment dans le temps, généralement par les millisecondes écoulées depuis le 1er janvier 1970 00:00:00 GMT .

3.1. java.util.Date

Nous pouvons représenter une date et une heure spécifiques en utilisant un objet Date . Cela contient une précision de millisecondes et les informations de fuseau horaire .

Bien qu'il existe de nombreux constructeurs disponibles, le moyen le plus simple de créer un objet Date représentant la date actuelle dans le fuseau horaire local consiste à utiliser le constructeur de base:

Date currentUtilDate = new Date();

Créons maintenant un objet Date pour une date et une heure spécifiques. Nous pourrions utiliser les constructeurs susmentionnés et passer simplement la valeur en millisecondes.

Alternativement, nous pouvons utiliser la classe SimpleDateFormat pour convertir une valeur String en un objet Date réel :

SimpleDateFormat dateFormatter = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); Date customUtilDate = dateFormatter.parse("30-01-2020 10:11:12");

Nous pouvons utiliser une large gamme de modèles de dates pour répondre à nos besoins.

3.2. java.util.Calendar

Un objet Calendar peut faire ce que fait une Date , et il est préférable pour les calculs arithmétiques de date car il peut également prendre un Locale . Nous pouvons spécifier les paramètres régionaux comme une région géographique, politique ou culturelle.

Pour obtenir la date actuelle, sans TimeZone ou Locale spécifié, nous pouvons utiliser la méthode getInstance :

Calendar currentUtilCalendar = Calendar.getInstance();

Et pour la conversion du calendrier en date , nous pouvons simplement utiliser la méthode getTime :

Date currentDate = Calendar.getInstance().getTime();

Fait amusant, la classe GregorianCalendar est l'implémentation du calendrier le plus utilisé au monde.

4. Le package java.sql

Ensuite, nous explorerons trois extensions de la classe java.util.Date qui représente les objets SQL équivalents.

4.1. java.sql.Date

Avec un objet java.sql.Date , nous n'avons pas accès aux informations de fuseau horaire et la précision est tronquée au niveau du jour . Pour représenter aujourd'hui, nous pouvons utiliser le constructeur qui prend une longue représentation de millisecondes:

Date currentSqlDate = new Date(System.currentTimeMillis());

Comme précédemment, pour une date spécifique, nous pouvons utiliser la classe SimpleDateFormat pour convertir d' abord en java.util.Date , puis obtenir les millisecondes à l'aide de la méthode getTime . Ensuite, nous pouvons transmettre cette valeur au constructeur java.sql.Date .

Nous pouvons simplement utiliser la méthode valueOf lorsque la représentation String d'une Date correspond au modèle aaaa- [m] m- [d] d :

Date customSqlDate = Date.valueOf("2020-01-30");

4.2. java.sql.Time

L' objet java.sql.Time offre un accès aux informations sur les heures, les minutes et les secondes - encore une fois, sans accès à un fuseau horaire. Obtenons l' heure actuelle en utilisant une représentation en millisecondes:

Time currentSqlTime = new Time(System.currentTimeMillis());

Pour spécifier une heure à l'aide de la méthode valueOf , nous pouvons passer une valeur correspondant au modèle hh: mm: ss :

Time customSqlTime = Time.valueOf("10:11:12");

4.3. java.sql.Timestamp

Dans cette dernière section, nous combinerons les informations de date et d' heure SQL à l'aide de la classe Timestamp . Cela nous permet d'avoir une précision jusqu'à nanosecondes .

Créons un objet Timestamp en passant à nouveau une valeur longue pour le nombre actuel de millisecondes au constructeur:

Timestamp currentSqlTimestamp = new Timestamp(System.currentTimeMillis());

Enfin, créons un nouvel horodatage personnalisé en utilisant la méthode valueOf avec le modèle requis aaaa- [m] m- [d] d hh: mm: ss [.f…] :

Timestamp customSqlTimestamp = Timestamp.valueOf("2020-1-30 10:11:12.123456789");

5. Conclusion

Dans ce court tutoriel, nous avons vu comment obtenir la date actuelle et la date pour un instant donné sans utiliser Java 8 ou aucune bibliothèque externe.

Comme toujours, le code de l'article est disponible à l'adresse over sur GitHub.