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.