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.