Différences entre ZonedDateTime et OffsetDateTime

1. Vue d'ensemble

ZonedDateTime et OffsetDateTime sont des classes assez populaires dans l' API Java 8 DateTime . De plus, les deux stockent un instant sur la chronologie jusqu'à une précision de nanosecondes . Et, au début, il peut être difficile de choisir entre eux.

Dans ce tutoriel rapide, nous allons examiner les différences entre ZonedDateTime et OffsetDateTime .

2. ZonedDateTime

Un ZonedDateTime est une représentation immuable d'une date-heure avec un fuseau horaire dans le système de calendrier ISO-8601, tel que 2007-12-03T10: 15: 30 + 01: 00 Europe / Paris . Il contient un état équivalent à trois objets distincts: un LocalDateTime , un ZoneId et le ZoneOffset résolu .

Ici, le ZoneId détermine comment et quand le décalage change. Ainsi, le décalage ne peut pas être défini librement, car la zone contrôle quels décalages sont valides.

Pour obtenir le ZonedDateTime actuel pour une région spécifique, nous utiliserons:

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

La classe ZonedDateTime fournit également des méthodes intégrées pour convertir une date donnée d'un fuseau horaire à un autre:

ZonedDateTime destZonedDateTime = sourceZonedDateTime.withZoneSameInstant(destZoneId);

Enfin, il est entièrement compatible DST et gère les ajustements d'heure d'été. Cela s'avère souvent pratique lorsque nous voulons afficher un champ date-heure dans un fuseau horaire spécifique.

3. OffsetDateTime

Un OffsetDateTime est une représentation immuable d'une date-heure avec un décalage par rapport à UTC / Greenwich dans le système de calendrier ISO-8601, tel que 2007-12-03T10: 15: 30 + 01: 00 . En d'autres termes, il stocke tous les champs de date et d'heure, avec une précision de nanosecondes, ainsi que le décalage par rapport à GMT / UTC .

Obtenons le OffsetDateTime actuel avec un décalage de deux heures par rapport à GMT / UTC:

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

4. Les principales différences

Premièrement, cela n'a pas de sens (sans conversions) de comparer directement deux dates avec des informations complètes sur le fuseau horaire. Par conséquent, nous devrions toujours préférer stocker OffsetDateTime dans la base de données sur ZonedDateTime , car les dates avec un décalage horaire local représentent toujours les mêmes instants dans le temps.

De plus, contrairement au ZonedDateTime , l'ajout d'un index sur une colonne stockant OffsetDateTime ne changera pas la signification de la date.

Résumons rapidement les principales différences.

ZonedDateHeure :

  • stocke tous les champs de date et d'heure, avec une précision de nanosecondes, et un fuseau horaire, avec un décalage de zone utilisé pour gérer les dates-heures locales ambiguës
  • ne peut pas définir librement les décalages, car la zone contrôle les valeurs de décalage valides
  • est entièrement conscient de l'heure d'été et gère les ajustements d'heure d'été
  • est pratique pour afficher les champs date-heure dans un fuseau horaire spécifique à l'utilisateur

OffsetDateTime :

  • stocke tous les champs de date et d'heure, avec une précision de nanosecondes, ainsi que le décalage par rapport à GMT / UTC (aucune information de fuseau horaire)
  • doit être utilisé pour stocker une date dans la base de données ou la communiquer sur un réseau

5. Conclusion

Dans ce didacticiel, nous avons couvert les différences entre le ZonedDateTime et le OffsetDateTime .

Comme d'habitude, le code source complet est disponible sur Github.