Vis alle tidszoner med GMT og UTC i Java

1. Oversigt

Når vi beskæftiger os med tidspunkter og datoer, har vi brug for en referenceramme. Standarden for det er UTC, men vi ser også GMT i nogle applikationer.

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

Dette fortæller Wikipedia os, hvad vi skal bruge:

For de fleste formål betragtes UTC som udskiftelig med Greenwich Mean Time (GMT), men GMT er ikke længere præcist defineret af det videnskabelige samfund.

Med andre ord, når vi først har sammensat en liste med tidszoneforskydninger i UTC, har vi den også til GMT.

Først skal vi se på Java 8-måde at opnå dette på og derefter se, hvordan vi kan få det samme resultat i Java 7.

2. Sådan får du en liste over zoner

Til at begynde med er vi nødt til at hente en liste over alle definerede tidszoner.

Til dette formål er ZoneId klasse har en praktisk statisk metode:

Sæt availableZoneIds = ZoneId.getAvailableZoneIds ();

Derefter kan vi bruge Sæt at generere en sorteret liste over tidszoner med deres tilsvarende forskydninger:

offentlig liste getTimeZoneList (OffsetBase base) {LocalDateTime nu = LocalDateTime.now (); returner ZoneId.getAvailableZoneIds (). stream () .map (ZoneId :: af) .sorteret (ny ZoneComparator ()) .map (id -> String.format ("(% s% s)% s", base, getOffset (nu, id), id.getId ())) .collect (Collectors.toList ()); }

Metoden ovenfor bruger en enum parameter, der repræsenterer den offset, vi vil se:

offentlig enum OffsetBase {GMT, UTC}

Lad os nu gå over koden mere detaljeret.

Når vi har hentet alle tilgængelige zone-id'er, har vi brug for en faktisk tidsreference repræsenteret af LocalDateTime.now ().

Derefter bruger vi Java'er Strøm API til at gentage hver post i vores sæt tidszone Snor id'er og omdanne den til en liste over formaterede tidszoner med den tilsvarende forskydning.

For hver af disse poster genererer vi en ZoneId eksempel med kort (ZoneId :: af).

3. Komprimering

Vi skal også finde faktiske UTC-forskydninger. For eksempel i tilfælde af centraleuropæisk tid ville forskydningen være +01:00.

For at få UTC-offset for en given zone kan vi bruge LocalDateTimes getOffset () metode.

Bemærk også, at Java repræsenterer +00:00 forskydninger som Z.

Så at have en konsekvent udseende Snor for tidszoner med nul forskydning erstatter vi Z med +00:00:

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

4. Oprettelse af zoner Sammenlignelig

Eventuelt kan vi også sortere tidszoner efter forskydning.

Til dette bruger 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. Visning af tidszoner

Alt der er tilbage at gøre er at sætte ovenstående stykker sammen ved at kalde getTimeZoneList () metode til hver OffsetBase enum værdi og visning af listerne:

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

Når vi kører ovenstående kode, udskriver tidszoner for UTC og GMT.

Her er et uddrag af, hvordan output vil se ud:

Tidszoner 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 gør denne opgave lettere ved at bruge Strøm og Dato og tid API'er.

Men hvis vi har en Java 7 og før et projekt, kan vi stadig opnå det samme resultat ved at stole på java.util.TimeZone klasse med sin getAvailableIDs () metode:

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

Den største forskel med Java 8-koden er offsetberegningen.

Det rawOffset vi kommer fra Tidszone()'S getRawOffset () metode udtrykker tidszonens forskydning i millisekunder.

Derfor er vi nødt til at konvertere dette til timer og minutter ved hjælp af 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)); returnere String.format ("% + 03d:% 02d", timer, Math.abs (minutter)); }

7. Konklusion

I denne hurtige vejledning har vi set, hvordan vi kan sammensætte en liste over alle tilgængelige tidszoner med deres UTC- og GMT-forskydninger.

Og som altid er den fulde kildekode til eksemplerne tilgængelig på GitHub.