ZoneOffset en Java

ZoneOffset en Java

1. introduction

Dans notre monde, chaque pays suit un certain fuseau horaire. Ces fuseaux horaires sont essentiels pour exprimer l'heure de manière pratique et efficace. Cependant, les fuseaux horaires peuvent parfois être inexplicables en raison de variables telles que l'heure d'été.

De plus, tout en représentant ces fuseaux horaires dans notre code, les choses peuvent devenir confuses. Java a fourni plusieurs classes telles queDate,Time etDateTime dans le passé pour prendre également en charge les fuseaux horaires.

Cependant, les nouvelles versions de Java ont mis au point des classes plus utiles et plus expressives telles queZoneId etZoneOffset, pour la gestion des fuseaux horaires.

Dans cet article,we’ll discuss ZoneId and ZoneOffset as well as related DateTime classes.

Nous pouvons également lire sur le nouvel ensemble de classesDateTime introduit dans Java 8, dans nosprevious post.

2. ZoneId etZoneOffset

Avec l'avènement deJSR-310, des API utiles ont été ajoutées pour gérer la date, l'heure et les fuseaux horaires. Les classesZoneId etZoneOffset ont également été ajoutées dans le cadre de cette mise à jour.

2.1. ZoneId

Comme indiqué ci-dessus,ZoneId is a representation of the time-zone tels que «Europe/Paris».

Il existe 2 implémentations deZoneId. Premièrement, avec un décalage fixe par rapport à GMT / UTC. Et deuxièmement, en tant que région géographique, qui a un ensemble de règles pour calculer le décalage avec GMT / UTC.

Créons unZoneId pour Berlin, Allemagne:

ZoneId zone = ZoneId.of("Europe/Berlin");

2.2. ZoneOffset

ZoneOffset extends ZoneId anddefinesthe fixed offset of the current time-zone with GMT/UTC, comme +02: 00.

Cela signifie que ce nombre représente des heures et des minutes fixes, représentant la différence entre l'heure du fuseau horaire actuel et l'heure GMT / UTC:

LocalDateTime now = LocalDateTime.now();
ZoneId zone = ZoneId.of("Europe/Berlin");
ZoneOffset zoneOffSet = zone.getRules().getOffset(now);

In case a country has 2 different offsets – in summer and winter, there will be 2 different ZoneOffset implementations for the same region, hence the need to specify a LocalDateTime.

3. DateTime Classes

Parlons ensuite de quelques classesDateTime, qui tirent réellement parti deZoneId etZoneOffset.

3.1. ZonedDateTime

ZonedDateTime est une représentation immuable d'une date-heure avec un fuseau horaire dans le système de calendrier ISO-8601, tel que2007-12-03T10:15:30+01:00 Europe/Paris. ZonedDateTime holds state equivalent to three separate objects, a LocalDateTime, a ZoneId and the resolved ZoneOffset

Cette classe stocke tous les champs de date et d'heure, avec une précision de nanosecondes, et un fuseau horaire, avec unZoneOffset, pour gérer les dates-heures locales ambiguës. Par exemple,ZonedDateTime peut stocker la valeur «2 octobre 2007 à 13: 45.30.123456789 +02: 00 dans le fuseau horaire Europe / Paris».

Obtenons lesZonedDateTime actuels pour la région précédente:

ZoneId zone = ZoneId.of("Europe/Berlin");
ZonedDateTime date = ZonedDateTime.now(zone);

ZonedDateTime also propose des fonctions intégrées, pour convertir une date donnée d'un fuseau horaire à un autre:

ZonedDateTime destDate = sourceDate.withZoneSameInstant(destZoneId);

3.2. OffsetDateTime

OffsetDateTime est une représentation immuable d'une date-heure avec un décalage dans le système de calendrier ISO-8601, tel que2007-12-03T10:15:30+01:00.

This class stores all date and time fields, to a precision of nanoseconds, as well as the offset from GMT/UTC. Par exemple,OffsetDateTime peut stocker la valeur «2 octobre 2007 à 13: 45.30.123456789 +02: 00».

Obtenons leOffsetDateTime actuel avec 2 heures de décalage par rapport à GMT / UTC:

ZoneOffset zoneOffSet= ZoneOffset.of("+02:00");
OffsetDateTime date = OffsetDateTime.now(zoneOffSet);

3.3. OffsetTime

OffsetTime est un objet date-heure immuable qui représente une heure, souvent considérée comme un décalage heure-minute-seconde, dans le système de calendrier ISO-8601, tel que10:15:30+01:00.

This class stores all time fields, to a precision of nanoseconds, as well as a zone offset. Par exemple,OffsetTime peut stocker la valeur «13: 45.30.123456789 + 02: 00».

Obtenons leOffsetTime actuel avec 2 heures de décalage:

ZoneOffset zoneOffSet = ZoneOffset.of("+02:00");
OffsetTime time = OffsetTime.now(zoneOffSet);

4. Conclusion

Pour revenir au point focal,ZoneOffset est une représentation du fuseau horaire en termes de différence entre GMT / UTC et l'heure donnée. C'est un moyen pratique de représenter le fuseau horaire, bien que d'autres représentations soient également disponibles.

De plus,ZoneId etZoneOffset ne sont pas seulement utilisés indépendamment mais aussi par certaines classes JavaDateTime telles queZonedDateTime,OffsetDateTime etOffsetTime.

Comme d'habitude, le code est disponible dans nosGitHub repository.