Je le sais:
- Instant est plutôt une représentation d'horodatage "technique" (nanosecondes) pour le calcul.
- LocalDateTime est plutôt une représentation date / horloge incluant des fuseaux horaires pour les humains.
À la fin, l'OMI peut être considérée comme un type pour la plupart des cas d'utilisation d'application. À titre d'exemple: actuellement, j'exécute un travail par lots où je dois calculer une prochaine exécution en fonction des dates et j'ai du mal à trouver un pour / contre entre ces deux types (à part l'avantage de précision en nanosecondes d'Instant et la partie fuseau horaire de LocalDateTime).
Pouvez-vous nommer quelques exemples d'application, où seuls Instant ou LocalDateTime doivent être utilisés?
Edit: Méfiez-vous des documentations mal lues pour LocalDateTime concernant la précision et le fuseau horaire
LocalDateTime
n'a pas de fuseau horaire!Réponses:
tl; dr
Instant
etLocalDateTime
sont deux animaux entièrement différents: l'un représente un moment, l'autre non.Instant
représente un moment, un point spécifique de la chronologie.LocalDateTime
représente une date et une heure. Mais sans fuseau horaire ou décalage par rapport à l'UTC, cette classe ne peut pas représenter un instant . Il représente des moments potentiels sur une plage d'environ 26 à 27 heures, la plage de tous les fuseaux horaires du globe.Présomption incorrecte
Votre déclaration est incorrecte: A
LocalDateTime
n'a pas de fuseau horaire . Ne pas avoir de fuseau horaire est tout l'intérêt de cette classe.Pour citer le doc de cette classe:
Signifie donc
Local…
«pas zoné, pas de décalage».Instant
An
Instant
est un moment de la chronologie en UTC , un décompte de nanosecondes depuis l'époque du premier moment de 1970 UTC (en gros, voir le doc de classe pour les détails les plus fins). Étant donné que la plupart de votre logique métier, stockage de données et échange de données doivent être en UTC, il s'agit d'une classe pratique à utiliser souvent.OffsetDateTime
La classe
OffsetDateTime
class représente un moment comme une date et une heure avec un contexte d'un certain nombre d'heures-minutes-secondes avant ou derrière UTC. La quantité de décalage, le nombre d'heures-minutes-secondes, est représentée par leZoneOffset
classe.Si le nombre d'heures-minutes-secondes est nul, an
OffsetDateTime
représente un moment en UTC identique à anInstant
.ZoneOffset
La
ZoneOffset
classe représente un décalage par rapport à UTC , un certain nombre d'heures-minutes-secondes devant UTC ou derrière UTC.A
ZoneOffset
n'est qu'un nombre d'heures-minutes-secondes, rien de plus. Une zone, c'est beaucoup plus, ayant un nom et un historique des changements à compenser. Il est donc toujours préférable d'utiliser une zone que d'utiliser un simple décalage.ZoneId
Un fuseau horaire est représenté par la
ZoneId
classe.Un nouveau jour se lève plus tôt à Paris qu'à Montréal , par exemple. Nous devons donc déplacer les aiguilles de l'horloge pour mieux refléter midi (lorsque le soleil est directement au-dessus) pour une région donnée. Plus la distance est / ouest est éloignée de la ligne UTC en Europe occidentale / Afrique, plus le décalage est important.
Un fuseau horaire est un ensemble de règles pour gérer les ajustements et les anomalies tels que pratiqués par une communauté ou une région locale. L'anomalie la plus courante est la folie bien trop populaire connue sous le nom d' heure d'été (DST) .
Un fuseau horaire a l'historique des règles passées, des règles actuelles et des règles confirmées pour un avenir proche.
Ces règles changent plus souvent que vous ne le pensez. Assurez-vous de garder à jour les règles de votre bibliothèque date-heure, généralement une copie de la base de données «tz» . La mise à jour est plus facile que jamais maintenant dans Java 8 avec Oracle libérant un outil de mise à jour de fuseau horaire .
Indiquez un nom de fuseau horaire approprié dans le format
Continent/Region
, tels queAmerica/Montreal
,Africa/Casablanca
ouPacific/Auckland
. N'utilisez jamais l'abréviation de 2 à 4 lettres telles queEST
ouIST
car ce ne sont pas de vrais fuseaux horaires, ni standardisés, ni même uniques (!).ZonedDateTime
Pensez
ZonedDateTime
conceptuellementInstant
à un assignéZoneId
.Pour capturer le moment actuel tel qu'il apparaît dans l'heure de l'horloge murale utilisée par les habitants d'une région particulière (un fuseau horaire):
La quasi-totalité de votre backend, base de données, logique métier, persistance des données, échange de données devraient tous être en UTC. Mais pour la présentation aux utilisateurs, vous devez vous ajuster dans un fuseau horaire attendu par l'utilisateur. C'est le but de la
ZonedDateTime
classe et des classes de formateur utilisées pour générer des représentations String de ces valeurs date-heure.Vous pouvez générer du texte au format localisé à l'aide de
DateTimeFormatter
.LocalDate
,LocalTime
,LocalDateTime
Les classes de date et heure « locale »,
LocalDateTime
,LocalDate
,LocalTime
, sont un autre type de créature. Ils ne sont liés à aucune localité ou fuseau horaire. Ils ne sont pas liés à la chronologie. Ils n'ont aucune signification réelle jusqu'à ce que vous les appliquiez à une localité pour trouver un point sur la chronologie.Le mot «local» dans ces noms de classe peut être contre-intuitif pour les non-initiés. Le mot signifie n'importe quelle localité, ou chaque localité, mais pas une localité particulière.
Ainsi, pour les applications professionnelles, les types "locaux" ne sont pas souvent utilisés car ils représentent simplement l'idée générale d'une date ou d'une heure possible et non d'un moment spécifique sur la chronologie. Les applications professionnelles ont tendance à se soucier du moment exact où une facture est arrivée, un produit expédié pour le transport, un employé a été embauché ou le taxi a quitté le garage. Les développeurs d'applications métier utilisent donc
Instant
et lesZonedDateTime
classes le plus souvent.Alors, quand utiliserions-nous
LocalDateTime
? Dans trois situations: où nous voulons appliquer une certaine date et heure à plusieurs endroits, où nous prenons des rendez-vous ou où nous avons un fuseau horaire prévu mais indéterminé. Notez qu'aucun de ces trois cas n'est un seul point spécifique sur la chronologie, aucun d'entre eux n'est un moment.Un moment de la journée, plusieurs moments
Parfois, nous voulons représenter un certain moment de la journée à une certaine date, mais nous voulons l'appliquer à plusieurs localités à travers les fuseaux horaires.
Par exemple, "Noël commence à minuit le 25 décembre 2015" est un
LocalDateTime
. Minuit frappe à différents moments à Paris qu'à Montréal, et à nouveau différent à Seattle et à Auckland .Un autre exemple, «Acme Company a pour politique que l'heure du déjeuner commence à 12 h 30 dans chacune de ses usines à travers le monde» est a
LocalTime
. Pour avoir un vrai sens, vous devez l'appliquer à la chronologie pour comprendre le moment de 12h30 à l' usine de Stuttgart ou de 12h30 à l' usine de Rabat ou de 12h30 à l' usine de Sydney .Prise de rendez-vous
Une autre situation à utiliser
LocalDateTime
est de réserver des événements futurs (ex: rendez-vous chez le dentiste). Ces nominations pourraient être suffisamment éloignées à l'avenir pour que vous risquiez que les politiciens redéfinissent le fuseau horaire. Les politiciens donnent souvent peu d'avertissement, voire aucun avertissement. Si vous voulez dire "15 h le 23 janvier prochain", quelle que soit la façon dont les politiciens peuvent jouer avec l'horloge, vous ne pouvez pas enregistrer un instant - cela verrait 15 h se transformer en 14 h ou 16 h si cette région adoptait ou abandonnait l'heure d'été, par exemple.Pour les rendez-vous, stockez a
LocalDateTime
et aZoneId
, conservés séparément. Plus tard, lors de la génération d'un planning, à la volée, déterminez un moment en appelantLocalDateTime::atZone( ZoneId )
pour générer unZonedDateTime
objet.Si nécessaire, vous pouvez vous ajuster sur UTC. Extraire un
Instant
duZonedDateTime
.Zone inconnue
Certaines personnes peuvent utiliser
LocalDateTime
dans une situation où le fuseau horaire ou le décalage est inconnu.Je considère que ce cas est inapproprié et imprudent. Si une zone ou un décalage est prévu mais indéterminé, vous avez de mauvaises données. Ce serait comme stocker un prix d'un produit sans connaître la devise souhaitée. Pas une bonne idée.
Tous les types date-heure
Pour être complet, voici un tableau de tous les types de date-heure possibles, à la fois modernes et hérités en Java, ainsi que ceux définis par la norme SQL. Cela pourrait aider à placer les classes
Instant
&LocalDateTime
dans un contexte plus large.Notez les choix étranges faits par l'équipe Java lors de la conception de JDBC 4.2. Ils ont choisi de prendre en charge tous les temps java.time … à l'exception des deux classes les plus utilisées:
Instant
&ZonedDateTime
.Mais ne vous inquiétez pas. Nous pouvons facilement convertir dans les deux sens.
Conversion
Instant
.Conversion
ZonedDateTime
.À propos de java.time
Le framework java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciens gênants hérités des classes date-heure tels que
java.util.Date
,Calendar
, etSimpleDateFormat
.Le projet Joda-Time , désormais en mode maintenance , conseille la migration vers les classes java.time .
Pour en savoir plus, consultez le didacticiel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .
Vous pouvez échanger des objets java.time directement avec votre base de données. Utilisez un pilote JDBC compatible avec JDBC 4.2 ou version ultérieure. Pas besoin de chaînes, pas besoin de
java.sql.*
cours.Où obtenir les classes java.time?
Le projet ThreeTen-Extra étend java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour de futurs ajouts possibles à java.time. Vous trouverez peut - être des classes utiles ici, comme
Interval
,YearWeek
,YearQuarter
et plus .la source
Local
dénomination. Mon intuition pour lesLocal
moyens par rapport à où je suis ET quand je suis (?!), Ce qui me fait croire que ce serait bien ce qu'est unZonedDateTime
.DateTime
nom de classe utilisé par son prédécesseur Joda-Time (producteurZonedDateTime
), pour souligner la différence avec les classes "locales". Considérez le nom «local» comme un raccourci pour «avoir besoin d'être appliqué à une localité particulière».Local
peut également avoir été un moyen de se différencier du package java.util, bien que je pense qu'il aurait pu y avoir un meilleur choix de mot.Une différence principale est la
Local
partie deLocalDateTime
. Si vous vivez en Allemagne et créez uneLocalDateTime
instance et que quelqu'un d'autre vit aux États-Unis et crée une autre instance au même moment (à condition que les horloges soient correctement réglées) - la valeur de ces objets serait en fait différente. Cela ne s'applique pas àInstant
, qui est calculé indépendamment du fuseau horaire.LocalDateTime
stocke la date et l'heure sans fuseau horaire, mais sa valeur initiale dépend du fuseau horaire.Instant
ce n'est pas le cas.De plus,
LocalDateTime
fournit des méthodes pour manipuler les composants de date comme les jours, les heures, les mois. EtInstant
non.Les deux classes ont la même précision.
LocalDateTime
ne stocke pas de fuseau horaire. Lisez javadocs attentivement, car vous pouvez faire une grosse erreur avec de telles hypothèses invalides: Instant et LocalDateTime .la source
LocalDateTime stores date and time without timezone, but it's initial value is timezone dependent
? quelle est la valeur initiale et comment dépend-elle du fuseau horaire? Merci.Vous vous trompez
LocalDateTime
: il ne stocke aucune information de fuseau horaire et il a une précision en nanosecondes. Citant le Javadoc (c'est moi qui souligne):La différence entre les deux est qu'elle
Instant
représente un décalage par rapport à l'époque (01-01-1970) et, en tant que telle, représente un instant particulier sur la ligne du temps. DeuxInstant
objets créés au même moment dans deux endroits différents de la Terre auront exactement la même valeur.la source
Instant
correspond à l'heure sur le méridien premier (Greenwich).Alors que par
LocalDateTime
rapport aux paramètres de fuseau horaire du système d'exploitation, etla source