Vis alle tidssoner med GMT og UTC i Java

1. Oversikt

Hver gang vi forholder oss til tider og datoer, trenger vi en referanseramme. Standarden for det er UTC, men vi ser også GMT i noen applikasjoner.

Kort sagt, UTC er standarden, mens GMT er en tidssone.

Dette er hva Wikipedia forteller oss om hva vi skal bruke:

For de fleste formål anses UTC å være utskiftbart med Greenwich Mean Time (GMT), men GMT er ikke lenger presist definert av det vitenskapelige samfunnet.

Med andre ord, når vi har samlet en liste med tidssoneforskyvninger i UTC, vil vi også ha den for GMT.

Først skal vi se på Java 8-måten å oppnå dette på, og deretter se hvordan vi kan få det samme resultatet i Java 7.

2. Få en liste over soner

Til å begynne med må vi hente en liste over alle definerte tidssoner.

For dette formålet er ZoneId klassen har en praktisk statisk metode:

Sett tilgjengeligZoneIds = ZoneId.getAvailableZoneIds ();

Deretter kan vi bruke Sett for å generere en sortert liste over tidssoner med tilhørende forskyvninger:

offentlig liste getTimeZoneList (OffsetBase base) {LocalDateTime nå = LocalDateTime.now (); return ZoneId.getAvailableZoneIds (). stream () .map (ZoneId :: of) .sorted (new ZoneComparator ()) .map (id -> String.format ("(% s% s)% s", base, getOffset (nå, id), id.getId ())) .collect (Collectors.toList ()); }

Metoden ovenfor bruker en enum parameter som representerer forskyvningen vi vil se:

offentlig enum OffsetBase {GMT, UTC}

La oss nå gå over koden mer detaljert.

Når vi har hentet alle tilgjengelige sone-ID-er, trenger vi en faktisk tidsreferanse, representert ved LocalDateTime.now ().

Etter det bruker vi Java Strøm API for å gjenta over hver oppføring i vårt sett med tidssone String ID-er og forvandler den til en liste over formaterte tidssoner med tilsvarende forskyvning.

For hver av disse oppføringene genererer vi en ZoneId eksempel med kart (ZoneId :: av).

3. Få forskyvninger

Vi må også finne faktiske UTC-forskyvninger. For eksempel når det gjelder sentral-europeisk tid, vil motregningen være +01:00.

For å få UTC-forskyvning for en gitt sone, kan vi bruke LocalDateTime's getOffset () metode.

Vær også oppmerksom på at Java representerer +00:00 forskyvninger som Z.

Så å ha en jevn utseende String for tidssoner med nullforskyvning erstatter vi Z med +00:00:

privat streng getOffset (LocalDateTime dateTime, ZoneId id) {retur dateTime .atZone (id) .getOffset () .getId () .replace ("Z", "+00: 00"); }

4. Å lage soner Sammenlignelig

Eventuelt kan vi også sortere tidssonene i henhold til forskyvning.

For dette bruker vi en ZoneComparator klasse:

privat klasse ZoneComparator implementerer 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 (); return offset1.compareTo (offset2); }}

5. Vise tidssoner

Alt som er igjen å gjøre er å sette de ovennevnte brikkene sammen ved å ringe getTimeZoneList () metode for hver OffsetBase enum verdi og vise listene:

offentlig klasse TimezoneDisplayApp {public static void main (String ... args) {TimezoneDisplay display = new TimezoneDisplay (); System.out.println ("Tidssoner i UTC:"); Liste utc = display.getTimeZoneList (TimezoneDisplay.OffsetBase.UTC); utc.forEach (System.out :: println); System.out.println ("Tidssoner i GMT:"); Liste gmt = display.getTimeZoneList (TimezoneDisplay.OffsetBase.GMT); gmt.forEach (System.out :: println); }}

Når vi kjører ovennevnte kode, vil den skrive ut tidssonene for UTC og GMT.

Her er et utdrag av hvordan utdataene vil se ut:

Tidssoner i UTC: (UTC + 14: 00) Pacific / Apia (UTC + 14: 00) Pacific / Kiritimati (UTC + 14: 00) Pacific / Tongatapu (UTC + 14: 00) Etc / GMT-14

6. Java 7 og før

Java 8 gjør denne oppgaven enklere ved å bruke Strøm og Dato og tid APIer.

Imidlertid, hvis vi har en Java 7 og før et prosjekt, kan vi fortsatt oppnå det samme resultatet ved å stole på java.util.TimeZone klasse med sin getAvailableIDs () metode:

offentlig liste getTimeZoneList (OffsetBase base) {String [] availableZoneIds = TimeZone.getAvailableIDs (); Liste resultat = ny ArrayList (availableZoneIds.length); for (String zoneId: availableZoneIds) {TimeZone curTimeZone = TimeZone.getTimeZone (zoneId); Strengoffset = beregne offset (curTimeZone.getRawOffset ()); result.add (String.format ("(% s% s)% s", base, offset, zoneId)); } Collections.sort (resultat); returresultat; }

Hovedforskjellen med Java 8-koden er forskyvningsberegningen.

De rawOffset vi kommer fra Tidssone()‘S getRawOffset () metoden uttrykker tidssoneens forskyvning i millisekunder.

Derfor må vi konvertere dette til timer og minutter ved hjelp av TimeUnit klasse:

privat streng beregneOffset (int rawOffset) {hvis (rawOffset == 0) {return "+00: 00"; } lange timer = TimeUnit.MILLISECONDS.toHours (rawOffset); lange minutter = TimeUnit.MILLISECONDS.toMinutes (rawOffset); minutter = Math.abs (minutter - TimeUnit.HOURS.toMinutes (timer)); returner String.format ("% + 03d:% 02d", timer, Math.abs (minutter)); }

7. Konklusjon

I denne raske opplæringen har vi sett hvordan vi kan lage en liste over alle tilgjengelige tidssoner med deres UTC- og GMT-forskyvning.

Og som alltid er hele kildekoden for eksemplene tilgjengelig på GitHub.


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