Quelle est la différence entre java 8 ZonedDateTime et OffsetDateTime?
J'ai lu la documentation, mais je ne peux toujours pas quand je dois utiliser l'un ou l'autre:
Selon la documentation OffsetDateTime
doit être utilisé lors de l'écriture de la date de la base de données, mais je ne comprends pas pourquoi.
- Fondamentalement, un
ZonedDateTime
contient également des informations sur les fuseaux horaires, y compris la commutation de l'heure d'été, etc à partir de ce que j'ai lu.
Vous devez vous connecter pour publier un commentaire.
La javadoc de dire ceci:
Source: https://docs.oracle.com/javase/8/docs/api/java/time/OffsetDateTime.html
Ainsi la différence entre les
OffsetDateTime
etZonedDateTime
est que cette dernière comprend les règles qui couvrent l'heure d'ajustements et de diverses autres anomalies.Il a simplement dit:
Dates, heure locale, les décalages représentent toujours les mêmes instants dans le temps, et, par conséquent, avoir une stabilité de la commande. En revanche, le sens de dates avec plein informations sur le fuseau horaire est instable dans le visage des ajustements aux règles pour les différents fuseaux horaires. (Et cela ne se passe; par exemple, pour la date-l'heure dans l'avenir.) Donc, si vous stockez et récupérez ensuite un
ZonedDateTime
la mise en œuvre, a un problème:Il peut stocker les valeurs de décalage ... et l'objet récupéré peut alors avoir un décalage qui est incompatible avec les règles actuelles de la zone-id.
Il peut jeter les valeurs de décalage ... et l'objet récupéré représente alors un autre point dans l'absolu universel /scénario que celui qui a été stocké.
Si vous utilisez Java sérialisation d'un objet, Java 9 en œuvre de la première approche. C'est sans doute le "plus correct" façon de gérer cela, mais cela ne semble pas être documentées. (Les pilotes JDBC et ORM liaisons sont sans doute les mêmes décisions, et on espère bien faire les choses.)
Mais si vous écrivez une application manuellement stocke les valeurs de date/heure, ou qui s'appuient sur
java.sql.DateTime
, puis traiter les complications d'une zone-id est ... sans doute quelque chose à éviter. D'où le conseil.Noter que les dates dont le sens /la commande est instable dans le temps peut être problématique pour une application. Et comme les changements aux règles de zone sont un cas limite, les problèmes sont susceptibles d'émerger à des moments inattendus.
Une (possible) deuxième raison pour laquelle l'avis est que la construction d'un
ZonedDateTime
est ambigu, à la certains points. Par exemple, dans la période dans le temps lorsque vous êtes "mettre les pendules à l'arrière", la combinaison d'une, heure locale, et une zone-id peut vous donner deux positions différentes. LeZonedDateTime
toujours choisir l'un sur l'autre ... mais ce n'est pas toujours le bon choix.Maintenant, cela pourrait être un problème pour toutes les applications en construire
ZonedDateTime
valeurs de cette façon. Mais du point de vue de quelqu'un bâtiment d'une application d'entreprise est un plus gros problème lors de l' (peut-être inexacte)ZonedDateTime
valeurs sont persistants et utilisé plus tard.ZonedDateTime
dans une db avec un offset et/ou sans id de zone, alors vous ne sont pas réellement stocker unZonedDateTime
. Vous stockez une autre abstraction!Instant
à la DB? Parce que dans ce cas le même point dans le temps est toujours représenté par exactement la même chaîne. AvecOffsetDateTime
etZonedDateTime
, il y a plusieurs chaînes de caractères qui peuvent représenter plus de la même point dans le temps, par exemple, 03:00 GMT 04:00 GMT+1, etc. Même des dates différentes pour le même point dans le temps.TIMESTAMP WITH TIME ZONE
à laOffsetDateTime
pas leZonedDateTime
.OffsetDateTime
dans une base de données. La base de données, les liaisons / JDBC / etc n'est discutable. La discussion s'en alla à une tangente ... et a été (malheureusement) mais mal informés. Mais de toute façon, ce n'est pas un forum de discussion.