ZoneOffset v Jave
1. Úvod
V našom svete sa každá krajina riadi určitým časovým pásmom. Tieto časové pásma sú rozhodujúce pre pohodlné a efektívne vyjadrenie času. Časové pásma však môžu byť niekedy nepresné kvôli premenným, ako je napríklad letný čas, ktoré prichádzajú do obrazu.
Okrem toho, pri predstavovaní týchto časových pásiem v našom kóde, môže to byť mätúce. Java poskytla viac tried ako napr Dátum, Čas a Dátum Čas v minulosti sa starali aj o časové pásma.
Nové verzie Java však prišli s užitočnejšími a expresívnejšími triedami ako napr ZoneId a ZoneOffset, na správu časových pásiem.
V tomto článku budeme diskutovať ZoneId a ZoneOffset ako aj súvisiace Dátum Čas triedy.
Môžeme si tiež prečítať o novej sade Dátum Čas triedy zavedené v Jave 8 v našom predchádzajúcom príspevku.
2. ZoneId a ZoneOffset
S príchodom JSR-310 boli pridané niektoré užitočné API pre správu dátumu, času a časových pásiem. ZoneId a ZoneOffset triedy boli tiež pridané ako súčasť tejto aktualizácie.
2.1. ZoneId
Ako bolo uvedené vyššie, ZoneId je znázornenie časového pásma ako napríklad „Európa / Paríž‘.
Existujú 2 implementácie ZoneId. Po prvé, s pevným posunom v porovnaní s GMT / UTC. A za druhé, ako geografický región, ktorý má súbor pravidiel na výpočet posunu pomocou GMT / UTC.
Vytvorme a ZoneId pre Berlín, Nemecko:
ZoneId zóna = ZoneId.of ("Európa / Berlín");
2.2. ZoneOffset
ZoneOffset predlžuje ZoneId adefinujepevný posun aktuálneho časového pásma s GMT / UTC, napríklad +02: 00.
To znamená, že toto číslo predstavuje pevné hodiny a minúty, čo predstavuje rozdiel medzi časom v aktuálnom časovom pásme a GMT / UTC:
LocalDateTime now = LocalDateTime.now (); ZoneId zóna = ZoneId.of ("Európa / Berlín"); ZoneOffset zoneOffSet = zone.getRules (). GetOffset (teraz);
V prípade, že má krajina 2 rôzne vyrovnania - v lete a v zime, budú 2 rôzne ZoneOffset implementácie pre ten istý región, z toho vyplýva potreba špecifikovať a LocalDateTime.
3. Dátum Čas Triedy
Ďalej poďme diskutovať o niektorých Dátum Čas triedy, ktoré skutočne využívajú výhody ZoneId a ZoneOffset.
3.1. ZonedDateTime
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. A ZonedDateTime obsahuje stav ekvivalentný trom samostatným objektom, a LocalDateTime, a ZoneId a vyriešené ZoneOffset.
Táto trieda ukladá všetky polia dátumu a času s presnosťou na nanosekundy a časové pásmo s a ZoneOffset, na spracovanie nejednoznačných miestnych dátumov a časov. Napríklad, ZonedDateTime môže uložiť hodnotu „2. októbra 2007 o 13: 45.30.123456789 +02: 00 v časovom pásme Európa / Paríž“.
Zoberme si prúd ZonedDateTime pre predchádzajúci región:
ZoneId zóna = ZoneId.of ("Európa / Berlín"); ZonedDateTime date = ZonedDateTime.now (zóna);
ZonedDateTime tiež poskytuje zabudované funkcie na prevod daného dátumu z jedného časového pásma na druhé:
ZonedDateTime destDate = sourceDate.withZoneSameInstant (destZoneId);
3.2. OffsetDateTime
OffsetDateTime je nemenná reprezentácia dátumu a času s posunom v kalendárnom systéme ISO-8601, ako napr 2007-12-03T10: 15: 30 + 01: 00.
Táto trieda ukladá všetky polia dátumu a času s presnosťou na nanosekundy a tiež s posunom od GMT / UTC. Napríklad,OffsetDateTime môže uložiť hodnotu „2. októbra 2007 o 13: 45.30.123456789 +02: 00“.
Zoberme si prúd OffsetDateTime s 2 hodinovým posunom od GMT / UTC:
ZoneOffset zoneOffSet = ZoneOffset.of ("+ 02:00"); OffsetDateTime date = OffsetDateTime.now (zoneOffSet);
3.3. Čas posunu
Čas posunu je nemenný objekt dátumu a času, ktorý predstavuje čas, ktorý sa v kalendárnom systéme ISO-8601 často považuje za posunutie hodín, minút a sekúnd, ako napr. 10:15:30+01:00.
Táto trieda ukladá všetky časové polia s presnosťou na nanosekundy a tiež na posun zóny. Napríklad, Čas posunu môže uložiť hodnotu „13: 45.30.123456789 + 02: 00“.
Zoberme si prúdČas posunus 2 hodinovým posunom:
ZoneOffset zoneOffSet = ZoneOffset.of ("+ 02:00"); OffsetTime time = OffsetTime.now (zoneOffSet);
4. Záver
Vrátiť sa k ústrednému bodu, ZoneOffset je vyjadrenie časového pásma z hľadiska rozdielu medzi GMT / UTC a daným časom. Toto je praktický spôsob vyjadrenia časovej zóny, aj keď sú k dispozícii aj iné vyjadrenia.
Navyše, ZoneId a ZoneOffset sa používajú nielen samostatne, ale aj určitými Dátum Čas Java triedy ako napr ZonedDateTime, OffsetDateTimea Čas posunu.
Ako obvykle je kód k dispozícii v našom úložisku GitHub.