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.


$config[zx-auto] not found$config[zx-overlay] not found