Forskjeller mellom ZonedDateTime og OffsetDateTime
1. Oversikt
ZonedDateTime og OffsetDateTime er ganske populære klasser i Java 8 Dato tid API. Dessuten, begge lagrer et øyeblikk på tidslinjen opp til en presisjon på nanosekunder. Og i begynnelsen kan det bli forvirrende å velge mellom dem.
I denne raske opplæringen skal vi se på forskjellene mellom ZonedDateTime og OffsetDateTime.
2. ZonedDateTime
EN ZonedDateTime er en uforanderlig fremstilling av en dato-tid med en tidssone i ISO-8601 kalendersystemet, for eksempel 2007-12-03T10: 15: 30 + 01: 00 Europe / Paris. Den har tilstand som tilsvarer tre separate objekter: a LocalDateTime, a ZoneId, og løst ZoneOffset.
Her, den ZoneId bestemmer hvordan og når forskyvningen endres. Så, forskyvningen kan ikke stilles fritt, ettersom sonen kontrollerer hvilke forskyvninger som er gyldige.
For å få strømmen ZonedDateTime for en bestemt region, bruker vi:
ZoneId zone = ZoneId.of ("Europe / Berlin"); ZonedDateTime zonedDateTime = ZonedDateTime.now (sone);
De ZonedDateTime klasse gir også innebygde metoder for å konvertere en gitt dato fra en tidssone til en annen:
ZonedDateTime destZonedDateTime = sourceZonedDateTime.withZoneSameInstant (destZoneId);
Endelig er det helt DST-bevisst og håndterer justering av sommertid. Det kommer ofte til nytte når vi vil vise et datofeltfelt i en bestemt tidssone.
3. OffsetDateTime
An OffsetDateTime er en uforanderlig fremstilling av en dato-tid med en forskyvning fra UTC / Greenwich i ISO-8601-kalendersystemet, som f.eks. 2007-12-03T10: 15: 30 + 01: 00. Med andre ord, den lagreralle dato- og tidsfelter, med en presisjon på nanosekunder, samt forskyvningen fra GMT / UTC.
La oss få strømmen OffsetDateTime med to timers forskyvning fra GMT / UTC:
ZoneOffset zoneOffSet = ZoneOffset.of ("+ 02:00"); OffsetDateTime offsetDateTime = OffsetDateTime.now (zoneOffSet);
4. De viktigste forskjellene
For det første er det ikke fornuftig (uten konverteringer) å sammenligne to datoer direkte med informasjon om full tidssone. Derfor, vi bør alltid foretrekke lagring OffsetDateTime i databasen over ZonedDateTime, da datoer med lokal tidsforskyvning alltid representerer de samme øyeblikkene i tide.
Dessuten, i motsetning til ZonedDateTime, og legger til en indeks over en kolonne som lagrer OffsetDateTime vil ikke endre datoen.
La oss raskt oppsummere nøkkelforskjellene.
ZonedDateTime:
- lagrer alle dato- og tidsfelter, med en presisjon på nanosekunder, og en tidssone, med en soneforskyvning som brukes til å håndtere tvetydige lokale dato-tider
- kan ikke fritt sette forskyvninger, siden sonen kontrollerer gyldige forskyvningsverdier
- er DST-bevisst og håndterer justeringer av sommertid
- er nyttig for visning av datofelt i en brukerspesifikk tidssone
OffsetDateTime:
- lagrer alle dato- og tidsfelter, med en presisjon på nanosekunder, samt forskyvning fra GMT / UTC (ingen tidssoneinformasjon)
- bør brukes til å lagre en dato i databasen eller kommunisere den over et nettverk
5. Konklusjon
I denne opplæringen dekket vi forskjellene mellom ZonedDateTime og OffsetDateTime.
Som vanlig er den komplette kildekoden tilgjengelig på Github.