Prikažite sve vremenske zone s GMT i UTC na Javi

1. Pregled

Kad god se bavimo vremenima i datumima, potreban nam je referentni okvir. Standard za to je UTC, ali GMT također vidimo u nekim aplikacijama.

Ukratko, UTC je standard, dok je GMT vremenska zona.

Ovo je ono što nam Wikipedia govori o tome što koristiti:

U većinu svrha UTC se smatra zamjenjivim s Greenwichskim srednjim vremenom (GMT), ali GMT više nije precizno definiran od strane znanstvene zajednice.

Drugim riječima, kad sastavimo popis s pomacima vremenskih zona u UTC, imat ćemo ga i za GMT.

Prvo ćemo pogledati način postizanja Java 8, a zatim ćemo vidjeti kako možemo dobiti isti rezultat u Javi 7.

2. Dobivanje popisa zona

Za početak moramo dohvatiti popis svih definiranih vremenskih zona.

U tu svrhu, ZoneId klasa ima praktičnu statičku metodu:

Postavi availableZoneIds = ZoneId.getAvailableZoneIds ();

Tada možemo koristiti Postavi za generiranje razvrstanog popisa vremenskih zona s pripadajućim pomacima:

javni popis getTimeZoneList (baza OffsetBase) {LocalDateTime sada = LocalDateTime.now (); vrati ZoneId.getAvailableZoneIds (). stream () .map (ZoneId :: of). sorted (new ZoneComparator ()) .map (id -> String.format ("(% s% s)% s", base, getOffset (sada, id), id.getId ())) .collect (Collectors.toList ()); }

Gornja metoda koristi nabrajanje parametar koji predstavlja pomak koji želimo vidjeti:

public enum OffsetBase {GMT, UTC}

Sada ćemo detaljnije preći na kod.

Nakon što dohvatimo sve dostupne ID-ove zona, trebamo stvarnu vremensku referencu predstavljenu s LocalDateTime.now ().

Nakon toga koristimo Java Stream API za ponavljanje svakog unosa u našem vremenskom pojasu Niz id-ove i pretvorite ih u popis formatiranih vremenskih zona s pripadajućim pomakom.

Za svaki od ovih unosa generiramo ZoneId primjer s karta (ZoneId :: of).

3. Dobivanje nadoknada

Također moramo pronaći stvarne UTC pomake. Primjerice, u slučaju srednjoeuropskog vremena pomak bi bio +01:00.

Možemo koristiti UTC pomak za bilo koju zonu GetOffset () LocalDateTimea metoda.

Također imajte na umu da Java predstavlja +00:00 kompenzira kao Z.

Dakle, da biste imali dosljedan izgled Niz za vremenske zone s pomakom nule zamijenit ćemo Z s +00:00:

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

4. Izrada zona Usporedive

Po želji vremenske zone također možemo sortirati prema pomaku.

Za ovo ćemo upotrijebiti a ZoneComparator razred:

privatna klasa ZoneComparator implementira Comparator {@Override public int compare (ZoneId zoneId1, ZoneId zoneId2) {LocalDateTime now = LocalDateTime.now (); ZoneOffset offset1 = now.atZone (zoneId1) .getOffset (); ZoneOffset offset2 = now.atZone (zoneId2) .getOffset (); povratak offset1.compareTo (offset2); }}

5. Prikaz vremenskih zona

Preostalo je samo spojiti gore navedene dijelove pozivom na getTimeZoneList () metoda za svaku Nabrajanje ofsetBase vrijednost i prikaz popisa:

javna klasa TimezoneDisplayApp {public static void main (String ... args) {TimezoneDisplay display = new TimezoneDisplay (); System.out.println ("Vremenske zone u UTC:"); Popis utc = display.getTimeZoneList (TimezoneDisplay.OffsetBase.UTC); utc.forEach (System.out :: println); System.out.println ("Vremenske zone u GMT:"); Popis gmt = display.getTimeZoneList (TimezoneDisplay.OffsetBase.GMT); gmt.forEach (System.out :: println); }}

Kad pokrenemo gornji kod, ispisat će vremenske zone za UTC i GMT.

Evo isječka kako će izlaz izgledati:

Vremenske zone u UTC: (UTC + 14: 00) Pacifik / Apia (UTC + 14: 00) Pacifik / Kiritimati (UTC + 14: 00) Pacifik / Tongatapu (UTC + 14: 00) itd. / GMT-14

6. Java 7 i prije

Java 8 olakšava ovaj zadatak korištenjem Stream i Datum i vrijeme Apis.

Međutim, ako imamo Javu 7 i prije projekta, još uvijek možemo postići isti rezultat oslanjanjem na java.util.TimeZone razred sa svojim getAvailableIDs () metoda:

javni popis getTimeZoneList (baza OffsetBase) {String [] availableZoneIds = TimeZone.getAvailableIDs (); Rezultat popisa = novi ArrayList (availableZoneIds.length); za (String zoneId: availableZoneIds) {TimeZone curTimeZone = TimeZone.getTimeZone (zoneId); Pomak niza = izračunajPokret (curTimeZone.getRawOffset ()); result.add (String.format ("(% s% s)% s", baza, pomak, zoneId)); } Collections.sort (rezultat); povratni rezultat; }

Glavna razlika s kodom Java 8 je izračun ofseta.

The rawOffset dolazimo od Vremenska zona()‘S getRawOffset () metoda izražava pomak vremenske zone u milisekundama.

Stoga to moramo pretvoriti u sate i minute pomoću TimeUnit razred:

privatni niz calcuOffset (int rawOffset) {if (rawOffset == 0) {return "+00: 00"; } dugi sati = TimeUnit.MILLISECONDS.toHours (rawOffset); duge minute = TimeUnit.MILLISECONDS.toMinutes (rawOffset); minute = Math.abs (minute - TimeUnit.HOURS.toMinutes (sati)); return String.format ("% + 03d:% 02d", sati, Math.abs (minute)); }

7. Zaključak

U ovom smo brzom vodiču vidjeli kako možemo sastaviti popis svih raspoloživih vremenskih zona s njihovim pomacima UTC i GMT.

Kao i uvijek, puni izvorni kod za primjere dostupan je na GitHubu.