Minden időzóna megjelenítése a GMT és az UTC-vel Java-ban

1. Áttekintés

Valahányszor időkkel és dátumokkal foglalkozunk, szükségünk van egy referenciakeretre. Ennek szabványa az UTC, de néhány alkalmazásban a GMT-t is látjuk.

Röviden: az UTC a szabvány, míg a GMT az időzóna.

Ez az, amit a Wikipédia elmond nekünk, mit kell használni:

A legtöbb célból az UTC-t felcserélhetőnek tekintik a Greenwichi Idővel (GMT), de a tudományos élet már nem határozza meg pontosan a GMT-t.

Más szavakkal, miután összeállítottunk egy listát az időzóna-eltolásokkal az UTC-ben, megkapjuk azt a GMT-hez is.

Először áttekintjük a Java 8 elérésének módját, majd meglátjuk, hogyan érhetjük el ugyanazt az eredményt a Java 7-ben.

2. A zónák felsorolása

Először be kell szereznünk egy listát az összes meghatározott időzónáról.

Erre a célra a ZoneId osztály hasznos statikus módszerrel rendelkezik:

Set availableZoneIds = ZoneId.getAvailableZoneIds ();

Ezután használhatjuk a Készlet az időzónák rendezett listájának létrehozásához a megfelelő eltolásokkal:

public list getTimeZoneList (OffsetBase alap) {LocalDateTime now = LocalDateTime.now (); return ZoneId.getAvailableZoneIds (). stream () .map (ZoneId :: of) .sorted (new ZoneComparator ()) .map (id -> String.format ("(% s% s)% s", base, getOffset (now, id), id.getId ())) .collect (Collectors.toList ()); }

A fenti módszer egy enum paraméter, amely a látni kívánt eltolást képviseli:

public enum OffsetBase {GMT, UTC}

Most nézzük át részletesebben a kódot.

Miután megkaptuk az összes rendelkezésre álló zónaazonosítót, szükségünk van egy tényleges időreferenciára, amelyet a LocalDateTime.now ().

Ezt követően Java-t használunk Folyam API az időzónánk minden bejegyzésének ismétléséhez Húr azonosítókat, és alakítsa át a megfelelő eltolással rendelkező formázott időzónák listájává.

Ezen bejegyzések mindegyikéhez előállítunk egy ZoneId például a térkép (ZoneId :: of).

3. Eltérések megszerzése

Meg kell találnunk a tényleges UTC-eltolásokat is. Például a közép-európai idő esetében az ellentételezés lenne +01:00.

Ahhoz, hogy az adott zóna UTC eltolását megkapjuk, használhatjuk A LocalDateTime getOffset () módszer.

Vegye figyelembe azt is, hogy a Java képviseli +00:00 beszámítások as Z.

Tehát, hogy következetes megjelenésű legyen Húr a nulla eltolással rendelkező időzónák esetén kicseréljük Z val vel +00:00:

privát karakterlánc getOffset (LocalDateTime dateTime, ZoneId id) {return dateTime .atZone (id) .getOffset () .getId () .replace ("Z", "+00: 00"); }

4. Zónák készítése Hasonló

Opcionálisan az időzónákat eltolás szerint is rendezhetjük.

Ehhez a ZoneComparator osztály:

private class ZoneComparator implementálja a Comparator {@Orride public int összehasonlítás (ZoneId zoneId1, ZoneId zoneId2) {LocalDateTime now = LocalDateTime.now (); ZoneOffset offset1 = now.atZone (zoneId1) .getOffset (); ZoneOffset offset2 = now.atZone (zoneId2) .getOffset (); return offset1.compareTo (offset2); }}

5. Az időzónák megjelenítése

Már csak a fenti darabokat kell összerakni a getTimeZoneList () módszer mindegyikre OffsetBase összesítés érték és a listák megjelenítése:

public class TimezoneDisplayApp {public static void main (String ... args) {TimezoneDisplay display = new TimezoneDisplay (); System.out.println ("Időzóna UTC-ben:"); List utc = display.getTimeZoneList (TimezoneDisplay.OffsetBase.UTC); utc.forEach (System.out :: println); System.out.println ("Időzóna GMT-ben:"); List gmt = display.getTimeZoneList (TimezoneDisplay.OffsetBase.GMT); gmt.forEach (System.out :: println); }}

Amikor a fenti kódot futtatjuk, kinyomtatja az UTC és a GMT időzónáit.

Itt van egy részlet arról, hogyan fog kinézni a kimenet:

Időzóna UTC-ben: (UTC + 14: 00) Csendes-óceán / Apia (UTC + 14: 00) Csendes-óceán / Kiritimati (UTC + 14: 00) Csendes-óceán / Tongatapu (UTC + 14: 00) stb. / GMT-14

6. Java 7 és előtte

A Java 8 megkönnyíti ezt a feladatot a Folyam és Dátum és idő API-k.

Ha azonban rendelkezünk Java 7-tel, és egy projekt előtt még mindig ugyanazt az eredményt érhetjük el a java.util.TimeZone osztály annak getAvailableIDs () módszer:

public list getTimeZoneList (OffsetBase base) {String [] availableZoneIds = TimeZone.getAvailableIDs (); Lista eredménye = new ArrayList (availableZoneIds.length); for (String zoneId: availableZoneIds) {TimeZone curTimeZone = TimeZone.getTimeZone (zoneId); Karakterlánc-eltolás = calcOffset (curTimeZone.getRawOffset ()); eredmény.add (Karakterlánc.formátum ("(% s% s)% s", alap, eltolás, zónaId)); } Gyűjtemények.rendezés (eredmény); visszatérési eredmény; }

A Java 8 kóddal való fő különbség az eltolás számítása.

A rawOffset származunk Időzóna()’S getRawOffset () módszer az időzóna eltolását milliszekundumban fejezi ki.

Ezért ezt órákra és percekre kell átalakítanunk a TimeUnit osztály:

privát karakterlánc calcOffset (int rawOffset) {if (rawOffset == 0) {return "+00: 00"; } hosszú órák = TimeUnit.MILLISECONDS.toHours (rawOffset); hosszú percek = TimeUnit.MILLISECONDS.toMinutes (rawOffset); perc = Math.abs (perc - TimeUnit.HOURS. - perc (óra)); return String.format ("% + 03d:% 02d", óra, Math.abs (perc)); }

7. Következtetés

Ebben a gyors bemutatóban láthattuk, hogyan állíthatjuk össze az összes rendelkezésre álló időzóna listáját az UTC és GMT eltolásokkal.

És mint mindig, a példák teljes forráskódja elérhető a GitHubon.


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