1. ZonedDateTimeclasse

Il existe une autre classe très intéressante dans l'API Date Time : la ZonedDateTimeclasse. Son objectif principal est de faciliter le travail avec des dates dans différents fuseaux horaires.

LocalDateest idéal pour représenter les dates. Par exemple, les anniversaires. Mon anniversaire est le 15 mars, peu importe où je suis. Ceci est un exemple de date.

LocalTimeest formidable pour décrire l'heure, comme l'heure d'un réveil : je règle l'alarme sur 5 heures du matin et peu importe où je me trouve. 5h00 est 5h00. Ceci est un exemple de travail avec le temps.

Supposons maintenant que nous écrivions une application qui réserve des vols. Les avions décollent et arrivent en fonction de l'heure locale. L'avion est en vol pendant une durée fixe, mais les fuseaux horaires peuvent changer.

Fuseaux horaires

Soit dit en passant, les fuseaux horaires sont un vrai gâchis. Et si vous pensez qu'il y a 24 fuseaux horaires, vous vous trompez lourdement.

Par exemple, l'heure en Inde diffère de l'heure de Greenwich de cinq heures et demie : GMT+5:30. Certains pays passent à l'heure d'été, d'autres non. De plus, différents pays passent à l'heure d'été à différents moments de l'année.

Et certains pays adoptent des lois qui annulent l'heure d'été, ou la réintroduisent, ou l'annulent à nouveau.

Quoi qu'il en soit, le monde a des fuseaux horaires, et dans chaque fuseau horaire il y a une heure. L'heure dans différentes zones peut coïncider pendant certaines périodes de l'année, puis différer pendant d'autres périodes. Les fuseaux horaires sont généralement nommés d'après les principales villes qui s'y trouvent : Europe/Monaco, Asia/Singapore, mais il existe également des exceptions — US/Pacific.

Officiellement, il y a actuellement 599 fuseaux horaires. Pensez-y : 599. C'est loin d'être 24. Bienvenue dans le monde global.

La ZoneIdclasse du java.timepackage est utilisée pour stocker un fuseau horaire en Java.

Soit dit en passant, il a une getAvailableZoneIds()méthode statique, qui renvoie l'ensemble de tous les fuseaux horaires actuellement connus. Pour obtenir une liste de toutes les zones, vous devez écrire le code suivant :

Code Sortie console (partielle)
for (String s: ZoneId.getAvailableZoneIds())
   System.out.println(s);
Asia/Aden
America/Cuiaba
Etc/GMT+9
Etc/GMT+8

Pour obtenir un ZoneIdobjet par son nom, vous devez utiliser la of()méthode statique ;

Code Note
ZoneId zone = ZoneId.of("Africa/Cairo");
Cairo


2. Créer un ZonedDateTimeobjet

Lors de la création d'un ZonedDateTimeobjet, vous devez appeler la now()méthode statique de la classe et ZoneIdlui transmettre un objet.

Code Sortie console
ZoneId zone = ZoneId.of("Africa/Cairo");
ZonedDateTime time = ZonedDateTime.now(zone);
System.out.println(time);


2019-02-22T11:37:58.074816+02:00[Africa/Cairo]

Si vous ne transmettez pas d' ZoneIdobjet à la now()méthode (et que cela est autorisé), le fuseau horaire est déterminé automatiquement en fonction des paramètres de l'ordinateur qui exécute le programme.

Exemple:

Code Sortie console
ZonedDateTime time = ZonedDateTime.now();
System.out.println(time);

2019-02-22T13:39:05.70842+02:00[Europe/Helsinki]

Convertir une date globale en une date locale

L'une des caractéristiques intéressantes de ZonedDateTimeest sa capacité à convertir une date et une heure locales. Exemple:

ZoneId zone = ZoneId.of("Africa/Cairo");
ZonedDateTime cairoTime = ZonedDateTime.now(zone);

LocalDate localDate = cairoTime.toLocalDate();
LocalTime localTime = cairoTime.toLocalTime();
LocalDateTime localDateTime = cairoTime.toLocalDateTime();

3. Travailler avec le temps

Comme la LocalDateTimeclasse, la ZonedDateTimeclasse a de nombreuses façons d'obtenir des éléments individuels d'une date et d'une heure. Voici une liste de ces méthodes :

int getYear()
Renvoie l'année d'une date spécifique
Month getMonth()
Renvoie le mois de la date : une constante parmi plusieurs —JANUARY, FEBRUARY, ...;
int getMonthValue()
Renvoie l'index du mois de la date. janvier == 1
int getDayOfMonth()
Renvoie l'indice du jour du mois
DayOfWeek getDayOfWeek()
Renvoie le jour de la semaine : une constante parmi plusieurs —MONDAY, TUESDAY, ...;
int getDayOfYear()
Renvoie l'indice du jour de l'année
int getHour()
Renvoie les heures
int getMinute()
Renvoie les minutes
int getSecond()
Renvoie les secondes
int getNano()
Renvoie les nanosecondes

Toutes les méthodes sont parfaitement analogues aux méthodes de la LocalDateTimeclasse. Et, bien sûr, la ZonedDateTimeclasse a des méthodes qui vous permettent de travailler avec des dates et des heures. Cela dit, l'objet sur lequel les méthodes sont appelées ne change pas. Au lieu de cela, ils renvoient un nouvel ZonedDateTimeobjet :

Méthodes Description
plusYears(int)
Ajoute des années à la date
plusMonths(int)
Ajoute des mois à la date
plusDays(int)
Ajoute des jours à la date
plusHours(int)
Ajoute des heures
plusMinutes(int)
Ajoute des minutes
plusSeconds(int)
Ajoute des secondes
plusNanos(int)
Ajoute des nanosecondes
minusYears(int)
Soustrait des années à la date
minusMonths(int)
Soustrait des mois de la date
minusDays(int)
Soustrait des jours de la date
minusHours(int)
Soustrait des heures
minusMinutes(int)
Soustrait des minutes
minusSeconds(int)
Soustrait des secondes
minusNanos(int)
Soustrait des nanosecondes

Nous ne donnerons pas d'exemples, car nous pensons que tout ici est clair par analogie avec les classes que nous venons de considérer.