Je le sais:
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
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é».
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.
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”
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 ) ;
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.
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?
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.