Rozdiely medzi ZonedDateTime a OffsetDateTime
1. Prehľad
ZonedDateTime a OffsetDateTime sú veľmi populárne triedy v prostredí Java 8 Dátum Čas API. Ďalej oba ukladajú okamih na časovej osi až s presnosťou nanosekúnd. A spočiatku môže byť mätúce vyberať medzi nimi.
V tomto rýchlom návode sa pozrieme na rozdiely medzi nimi ZonedDateTime a OffsetDateTime.
2. ZonedDateTime
A ZonedDateTime je nemenná reprezentácia dátumu a času s časovým pásmom v kalendárnom systéme ISO-8601, ako napr 2007-12-03T10: 15: 30 + 01: 00 Európa / Paris. Drží stav ekvivalentný trom samostatným objektom: a LocalDateTime, a ZoneId, a vyriešené ZoneOffset.
Tu je ZoneId určuje, ako a kedy sa offset zmení. Ofset teda nemožno voľne nastaviť, pretože zóna určuje, ktoré ofsety sú platné.
Ak chcete získať prúd ZonedDateTime pre konkrétny región použijeme:
ZoneId zóna = ZoneId.of ("Európa / Berlín"); ZonedDateTime zonedDateTime = ZonedDateTime.now (zóna);
The ZonedDateTime trieda tiež poskytuje vstavané metódy na prevod daného dátumu z jednej časovej zóny na druhú:
ZonedDateTime destZonedDateTime = sourceZonedDateTime.withZoneSameInstant (destZoneId);
Nakoniec je plne si uvedomuje DST a zvláda úpravy letného času. Často sa to hodí, keď chceme zobraziť pole dátumu a času v konkrétnom časovom pásme.
3. OffsetDateTime
An OffsetDateTime je nemenná reprezentácia dátumu a času s posunom od UTC / Greenwich v kalendárnom systéme ISO-8601, ako napr. 2007-12-03T10: 15: 30 + 01: 00. Inými slovami, ukladá savšetky polia dátumu a času, s presnosťou na nanosekundy, ako aj posun od GMT / UTC.
Poďme na prúd OffsetDateTime s dvojhodinovým posunom od GMT / UTC:
ZoneOffset zoneOffSet = ZoneOffset.of ("+ 02:00"); OffsetDateTime offsetDateTime = OffsetDateTime.now (zoneOffSet);
4. Hlavné rozdiely
Po prvé, nemá zmysel (bez prepočtov) priame porovnanie dvoch dátumov s informáciami o úplnom časovom pásme. Preto mali by sme vždy uprednostňovať skladovanie OffsetDateTime v databáze nad ZonedDateTime, pretože dátumy s posunom miestneho času vždy predstavujú rovnaké časové okamihy.
Navyše, na rozdiel od ZonedDateTime, pridanie indexu nad stĺpec s uložením OffsetDateTime nezmení význam dátumu.
Poďme si rýchlo zhrnúť kľúčové rozdiely.
ZonedDateTime:
- ukladá všetky polia dátumu a času s presnosťou na nanosekundy a časové pásmo s posunom zóny použitým na spracovanie nejednoznačných miestnych dátumov a časov
- nie je možné voľne nastavovať vyrovnania, pretože zóna riadi platné hodnoty posunu
- je plne informovaný o DST a spracováva úpravy letného času
- hodí sa na zobrazovanie polí dátumu a času v časovom pásme konkrétnom pre používateľa
OffsetDateTime:
- ukladá všetky polia dátumu a času s presnosťou na nanosekundy, ako aj posun od GMT / UTC (žiadne informácie o časovom pásme)
- by sa mali používať na ukladanie dátumu do databázy alebo na komunikáciu po sieti
5. Záver
V tomto tutoriáli sme sa venovali rozdielom medzi ZonedDateTime a OffsetDateTime.
Celý zdrojový kód je ako obvykle k dispozícii na serveri Github.