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.