Zobrazenie všetkých časových zón s GMT a UTC v jazyku Java

1. Prehľad

Kedykoľvek pracujeme s časmi a dátumami, potrebujeme referenčný rámec. Štandardom je UTC, ale v niektorých aplikáciách vidíme aj GMT.

Stručne povedané, UTC je štandard, zatiaľ čo GMT je časové pásmo.

Toto nám hovorí Wikipedia, čo sa týka použitia:

Pre väčšinu účelov sa UTC považuje za zameniteľný s greenwichským stredným časom (GMT), vedecká komunita však už GMT presne nedefinuje.

Inými slovami, akonáhle zostavíme zoznam s posunmi časových pásiem v UTC, budeme ho mať aj pre GMT.

Najskôr sa pozrieme na spôsob dosiahnutia Java 8 a potom uvidíme, ako môžeme dosiahnuť rovnaký výsledok v prostredí Java 7.

2. Získanie zoznamu zón

Na začiatok musíme získať zoznam všetkých definovaných časových pásiem.

Na tento účel ZoneId trieda má praktickú statickú metódu:

Nastaviť availableZoneIds = ZoneId.getAvailableZoneIds ();

Potom môžeme použiť Nastaviť vygenerovať zoradený zoznam časových pásiem s ich príslušnými vyrovnaniami:

public List getTimeZoneList (základňa OffsetBase) {LocalDateTime now = LocalDateTime.now (); vrátiť ZoneId.getAvailableZoneIds (). stream () .map (ZoneId :: of) .sorted (nový ZoneComparator ()) .map (id -> String.format ("(% s% s)% s", base, getOffset) (now, id), id.getId ())) .collect (Collectors.toList ()); }

Vyššie uvedená metóda používa enum parameter, ktorý predstavuje posun, ktorý chceme vidieť:

verejné enum OffsetBase {GMT, UTC}

Poďme si podrobnejšie prečítať kód.

Po načítaní všetkých dostupných ID zón potrebujeme skutočný časový údaj, ktorý predstavuje LocalDateTime.now ().

Potom používame Java Prúd API na iteráciu nad každou položkou v našej množine časových pásiem String ID a transformujte ho na zoznam formátovaných časových pásiem s príslušným posunom.

Pre každú z týchto položiek vygenerujeme a ZoneId napríklad s mapa (ZoneId :: z).

3. Započítavanie kompenzácií

Musíme tiež nájsť skutočné kompenzácie UTC. Napríklad v prípade stredoeurópskeho času by bol offset +01:00.

Na získanie posunu UTC pre ktorúkoľvek zónu môžeme použiť GetOffset () LocalDateTime metóda.

Tiež si všimnite, že Java predstavuje +00:00 kompenzuje ako Z.

Aby ste mali dôsledný vzhľad String pre časové pásma s nulovým posunom nahradíme Z s +00:00:

private String getOffset (LocalDateTime dateTime, ZoneId id) {return dateTime .atZone (id) .getOffset () .getId () .replace ("Z", "+00: 00"); }

4. Tvorba zón Porovnateľné

Voliteľne môžeme časové pásma zoradiť aj podľa posunu.

Na tento účel použijeme a ZoneComparator trieda:

súkromná trieda ZoneComparator implementuje komparátor {@Override public int compare (ZoneId zoneId1, ZoneId zoneId2) {LocalDateTime now = LocalDateTime.now (); ZoneOffset offset1 = now.atZone (zoneId1) .getOffset (); ZoneOffset offset2 = now.atZone (zoneId2) .getOffset (); návrat offset1.compareTo (offset2); }}

5. Zobrazenie časových pásiem

Ostáva už len spojiť vyššie uvedené kúsky zavolaním getTimeZoneList () metóda pre každého OffsetBase enum hodnotu a zobrazenie zoznamov:

public class TimezoneDisplayApp {public static void main (String ... args) {TimezoneDisplay display = new TimezoneDisplay (); System.out.println ("Časové pásma v UTC:"); Zoznam utc = display.getTimeZoneList (TimezoneDisplay.OffsetBase.UTC); utc.forEach (System.out :: println); System.out.println ("Časové pásma v GMT:"); Zoznam gmt = display.getTimeZoneList (TimezoneDisplay.OffsetBase.GMT); gmt.forEach (System.out :: println); }}

Keď spustíme vyššie uvedený kód, vytlačí časové pásma pre UTC a GMT.

Tu je úryvok z toho, ako bude výstup vyzerať:

Časové pásma v UTC: (UTC + 14:00) Tichý oceán / Apia (UTC + 14:00) Tichý oceán / Kiritimati (UTC + 14:00) Tichý oceán / Tongatapu (UTC + 14:00) atď. / GMT-14

6. Java 7 a predtým

Java 8 uľahčuje túto úlohu používaním Prúd a Dátum a čas API.

Pokiaľ však máme Java 7 a pred projektom, môžeme stále dosiahnuť rovnaký výsledok spoliehaním sa na java.util.TimeZone trieda s jeho getAvailableIDs () metóda:

verejný zoznam getTimeZoneList (základňa OffsetBase) {String [] availableZoneIds = TimeZone.getAvailableIDs (); Výsledok zoznamu = nový ArrayList (availableZoneIds.length); pre (String zoneId: availableZoneIds) {TimeZone curTimeZone = TimeZone.getTimeZone (zoneId); Posun reťazca = vypočítaťOffset (curTimeZone.getRawOffset ()); result.add (String.format ("(% s% s)% s", base, offset, zoneId)); } Collections.sort (výsledok); návratový výsledok; }

Hlavným rozdielom v kóde Java 8 je výpočet offsetu.

The rawOffset máme z Časové pásmo()‘S getRawOffset () metóda vyjadruje posun časového pásma v milisekundách.

Preto to musíme previesť na hodiny a minúty pomocou TimeUnit trieda:

private String CalculateOffset (int rawOffset) {if (rawOffset == 0) {return "+00: 00"; } dlhé hodiny = TimeUnit.MILLISECONDS.toHours (rawOffset); dlhé minúty = TimeUnit.MILLISECONDS.toMinutes (rawOffset); minúty = Math.abs (minúty - TimeUnit.HOURS.toMinutes (hodiny)); return String.format ("% + 03d:% 02d", hodiny, Math.abs (minúty)); }

7. Záver

V tomto rýchlom návode sme videli, ako môžeme zostaviť zoznam všetkých dostupných časových pásiem s ich kompenzáciami UTC a GMT.

Celý zdrojový kód príkladov je ako vždy k dispozícii na GitHub.


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