Quelle est la différence entre InstantDate et LocalDateTime?

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 / heure, y compris les fuseaux horaires pour les humains.

Toujours à la fin, IMO peut être pris comme type pour la plupart des cas d’utilisation d’applications. À titre d’exemple: j’exécute actuellement un travail par lots pour lequel je dois calculer une prochaine exécution en fonction des dates et je ne parviens pas à trouver des avantages / inconvénients entre ces deux types (à part l’avantage de précision nanoseconde de LocalDateTime).

Pouvez-vous nommer des exemples d’application, où seuls Instant ou LocalDateTime doivent être utilisés?

Edit: Méfiez-vous des documentations erronées pour LocalDateTime en ce qui concerne la précision et le fuseau horaire

Présomption incorrecte

LocalDateTime est plutôt une représentation date / heure, y compris les fuseaux horaires pour les humains.

Votre déclaration est incorrecte: un LocalDateTime n’a pas de fuseau horaire . Ne pas avoir de fuseau horaire est le point entier de cette classe.

Pour citer cette classe ‘doc:

Cette classe ne stocke ni ne représente un fuseau horaire. Au lieu de cela, il s’agit d’une description de la date, telle qu’elle est utilisée pour les anniversaires, combinée à l’heure locale telle qu’elle apparaît sur une horloge murale. Il ne peut pas représenter un instant sur la ligne de temps sans informations supplémentaires telles qu’un décalage ou un fuseau horaire.

So Local… signifie «pas zoné».

Instant

entrer la description de l'image ici

Un Instant est un moment de la chronologie en UTC , un compte de nanosecondes depuis l’époque du premier moment de 1970 UTC (en gros, voir la doc de classe pour des détails précis). Étant donné que la plus grande partie de votre logique métier, de votre stockage de données et de vos échanges de données doit se faire en UTC, cette classe est souvent utile.

 Instant instant = Instant.now() ; // Capture the current moment in UTC. 

ZoneId

entrer la description de l'image ici

Un ZoneId est un fuseau horaire .

Un fuseau horaire est un décalage de tant d’heures et de minutes loin de l’UTC. Une nouvelle journée s’annonce plus tôt à Paris qu’à Montréal , par exemple. Nous devons donc déplacer les aiguilles de l’horloge pour mieux refléter le midi (lorsque le soleil est directement au-dessus de nous) pour une région donnée. Plus la ligne UTC en Europe de l’Ouest / Afrique est éloignée vers l’est / l’ouest, plus le décalage est important.

De plus, un fuseau horaire est un ensemble de règles pour la gestion des ajustements et des anomalies, telles qu’elles sont pratiquées par une communauté ou une région locale. L’anomalie la plus courante est la folie trop populaire connue sous le nom de l’ heure d’été .

Un fuseau horaire présente l’historique des règles passées, des règles actuelles et des règles confirmées pour le futur proche.

Ces règles changent plus souvent que prévu. Veillez à conserver à jour les règles de votre bibliothèque date-heure, généralement une copie de la firebase database ‘tz’ . Rester à jour est plus facile que jamais avec Java 8 avec Oracle publiant un outil Timezone Updater .

Utilisez les noms de fuseau horaire appropriés . Ces noms prennent la forme d’un continent plus un SLASH plus une ville ou une région. Évitez les codes de 3-4 lettres tels que EST ou IST . Ils ne sont ni standardisés ni uniques. Ils confondent encore le désordre de DST.

Fuseau horaire = décalage + règles d’ajustement

 ZoneId z = ZoneId.of( “Africa/Tunis” ) ; 

Parfois, nous n’avons qu’un décalage sans les règles. Java fournit à ZoneOffset une sous-classe de ZoneId . Notez la constante pratique définie ici, ZoneOffset.UTC .

 ZoneOffset offset = ZoneOffset.of( -5 , 0 ) ; // “-05:00” 

ZonedDateTime

entrer la description de l'image ici

Considérez conceptuellement ZonedDateTime comme un Instant avec un ZoneId assigné.

ZonedDateTime = (Instant + ZoneId)

La quasi-totalité de votre backend, de votre firebase database, de votre logique métier, de la persistance des données et de l’échange de données doivent tous être en UTC. Mais pour la présentation aux utilisateurs, vous devez vous adapter à un fuseau horaire attendu par l’utilisateur. C’est le but de la classe ZonedDateTime et des classes de formatage utilisées pour générer des représentations Ssortingng de ces valeurs date-heure.

 ZonedDateTime zdt = instant.atZone( z ) ; 

LocalDateTime, LocalDate, LocalTime

entrer la description de l'image ici

Les classes de date et heure “locales”, LocalDateTime , LocalDate , LocalTime , sont un type de LocalTime différent. Les 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 ligne de temps.

Par exemple, “Noël commence à minuit le 25 décembre 2015” est un LocalDateTime . Minuit frappe à différents moments à Paris qu’à Montréal, et différent encore à Seattle et à Auckland .

 LocalDate ld = LocalDate.of( 2018 , Month.DECEMBER , 25 ) ; LocalTime lt = LocalTime.MIN ; // 00:00:00 LocalTime ldt = LocalDateTime.of( ld , lt ) ; // Xmas morning anywhere. 

Un autre exemple, “Acme Company a pour politique que l’heure du déjeuner commence à 12h30 dans chacune de ses usines dans le monde” est un LocalTime . Pour avoir une vraie signification, vous devez l’appliquer à la chronologie pour déterminer le moment de 12h30 à l’usine de Stuttgart ou à 12h30 à l’usine de Rabat ou à 12h30 à l’usine de Sydney .

Donc, pour les applications professionnelles, les types “Local” 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 ligne de temps. Les applications professionnelles ont tendance à se soucier du moment exact où une facture est arrivée, d’un produit expédié pour le transport, d’un employé a été embauché ou du taxi a quitté le garage. Ainsi, les développeurs d’applications professionnelles utilisent Instant et ZonedDateTime presque exclusivement. D’un autre côté, vous devriez envisager d’utiliser les types Local… pour réserver des événements futurs (ex: rendez-vous chez le dentiste) suffisamment loin dans le futur pour risquer que les politiciens affinent le fuseau horaire.


À propos de java.time

Le framework java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciennes classes de date / heure héritées telles que java.util.Date , Calendar et SimpleDateFormat .

Le projet Joda-Time , maintenant 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 objects java.time directement avec votre firebase database. Utilisez un pilote JDBC compatible avec JDBC 4.2 ou version ultérieure. Pas besoin de chaînes, pas besoin de classes java.sql.* .

Où obtenir les classes java.time?

  • Java SE 8 , Java SE 9 , Java SE 10 et versions ultérieures
    • Intégré
    • Partie de l’API Java standard avec une implémentation intégrée.
    • Java 9 ajoute quelques fonctionnalités et corrections mineures.
  • Java SE 6 et Java SE 7
    • Une grande partie de la fonctionnalité java.time est transférée vers Java 6 et 7 dans ThreeTen-Backport .
  • Android
    • Versions ultérieures des implémentations de bundles Android des classes java.time.
    • Pour Android antérieur (<26), le projet ThreeTenABP adapte ThreeTen-Backport (mentionné ci-dessus). Voir Comment utiliser ThreeTenABP… .

Le projet ThreeTen-Extra étend java.time avec des classes supplémentaires. Ce projet est un terrain d’essai pour d’éventuels ajouts futurs à java.time. Vous pouvez y trouver des classes utiles telles que Interval , YearWeek , YearQuarter , etc.

La principale différence est la partie Local de LocalDateTime . Si vous vivez en Allemagne et créez une instance de LocalDateTime et que quelqu’un d’autre habite aux États-Unis et crée une autre instance au même moment (à condition que les horloges soient correctement définies), la valeur de ces objects serait différente. Ceci 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 n’est pas.

De plus, LocalDateTime fournit des méthodes pour manipuler des composants de date tels que des jours, des heures, des mois. Un Instant n’est pas.

outre l’avantage de précision nanoseconde d’Instant et de la partie fuseau horaire de LocalDateTime

Les deux classes ont la même précision. LocalDateTime ne stocke pas le fuseau horaire. Lisez attentivement les javadocs, car vous pouvez commettre une grosse erreur avec de telles hypothèses non valides: Instant et LocalDateTime .

Vous avez tort sur LocalDateTime : il ne stocke aucune information de fuseau horaire et sa précision est de l’ordre de la nanoseconde. Citant le Javadoc (le mien accent):

Date-heure sans fuseau horaire dans le système de calendrier ISO-8601 , par exemple 2007-12-03T10: 15: 30.

LocalDateTime est un object date-heure immuable qui représente une date-heure, souvent considérée comme année-mois-jour-heure-minute-seconde. D’autres champs de date et d’heure, tels que le jour de l’année, le jour de la semaine et la semaine de l’année, sont également accessibles. Le temps est représenté avec une précision à la nanoseconde . Par exemple, la valeur “2 octobre 2007 à 13: 45.30.123456789” peut être stockée dans un LocalDateTime.

La différence entre les deux est que Instant représente un décalage par rapport à l’époque (01-01-1970) et, en tant que tel, représente un instant particulier sur la ligne temporelle. Deux objects Instant créés au même moment dans deux endroits différents de la Terre auront exactement la même valeur.

Instant correspond au temps sur le méridien d’origine (Greenwich).

Considérant que LocalDateTime rapport aux parameters de fuseau horaire du système d’exploitation, et

ne peut pas représenter un instant sans informations supplémentaires telles qu’un décalage ou un fuseau horaire.