Alle tijdzones weergeven met GMT en UTC in Java

1. Overzicht

Elke keer als we te maken hebben met tijden en datums, hebben we een referentiekader nodig. De standaard daarvoor is UTC, maar we zien ook GMT in sommige applicaties.

Kortom, UTC is de standaard, terwijl GMT een tijdzone is.

Dit is wat Wikipedia ons vertelt over wat te gebruiken:

Voor de meeste doeleinden wordt UTC als uitwisselbaar beschouwd met Greenwich Mean Time (GMT), maar GMT wordt niet langer nauwkeurig gedefinieerd door de wetenschappelijke gemeenschap.

Met andere woorden, zodra we een lijst met tijdzoneverschuivingen in UTC hebben samengesteld, hebben we die ook voor GMT.

Eerst zullen we kijken naar de Java 8-manier om dit te bereiken en dan zullen we zien hoe we hetzelfde resultaat kunnen krijgen in Java 7.

2. Een lijst met zones opvragen

Om te beginnen moeten we een lijst met alle gedefinieerde tijdzones ophalen.

Voor dit doel is het ZoneId class heeft een handige statische methode:

Set availableZoneIds = ZoneId.getAvailableZoneIds ();

Vervolgens kunnen we de Set om een ​​gesorteerde lijst met tijdzones met hun bijbehorende verschuivingen te genereren:

openbare lijst getTimeZoneList (OffsetBase-basis) {LocalDateTime now = LocalDateTime.now (); return ZoneId.getAvailableZoneIds (). stream () .map (ZoneId :: of) .sorted (nieuwe ZoneComparator ()) .map (id -> String.format ("(% s% s)% s", base, getOffset (nu, id), id.getId ())) .collect (Collectors.toList ()); }

De bovenstaande methode gebruikt een opsomming parameter die de offset vertegenwoordigt die we willen zien:

openbare opsomming OffsetBase {GMT, UTC}

Laten we nu de code in meer detail bespreken.

Zodra we alle beschikbare zone-ID's hebben opgehaald, hebben we een actuele tijdreferentie nodig, vertegenwoordigd door LocalDateTime.now ().

Daarna gebruiken we Java's Stroom API om elk item in onze tijdzone te herhalen Draad id's en transformeer het in een lijst met opgemaakte tijdzones met de bijbehorende offset.

Voor elk van deze items genereren we een ZoneId bijvoorbeeld met map (ZoneId :: of).

3. Offsets krijgen

We moeten ook daadwerkelijke UTC-offsets vinden. In het geval van Central European Time zou de offset bijvoorbeeld zijn +01:00.

Om de UTC-offset voor een bepaalde zone te krijgen, kunnen we gebruiken GetOffset () van LocalDateTime methode.

Merk ook op dat Java vertegenwoordigt +00:00 offsets als Z.

Dus om er consistent uit te zien Draad voor tijdzones met de nul-offset, zullen we vervangen Z met +00:00:

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

4. Zones maken Vergelijkbaar

Optioneel kunnen we de tijdzones ook sorteren op offset.

Hiervoor gebruiken we een ZoneComparator klasse:

private class ZoneComparator implementeert 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 (); retourneer offset1.compareTo (offset2); }}

5. Tijdzones weergeven

Het enige dat u hoeft te doen, is de bovenstaande stukken samenvoegen door de getTimeZoneList () methode voor elk OffsetBase enum waarde en weergave van de lijsten:

openbare klasse TimezoneDisplayApp {openbare statische leegte hoofd (String ... args) {TimezoneDisplay display = nieuwe TimezoneDisplay (); System.out.println ("Tijdzones in UTC:"); Lijst utc = display.getTimeZoneList (TimezoneDisplay.OffsetBase.UTC); utc.forEach (System.out :: println); System.out.println ("Tijdzones in GMT:"); Lijst gmt = display.getTimeZoneList (TimezoneDisplay.OffsetBase.GMT); gmt.forEach (System.out :: println); }}

Wanneer we de bovenstaande code uitvoeren, worden de tijdzones voor UTC en GMT afgedrukt.

Hier is een fragment van hoe de uitvoer eruit zal zien:

Tijdzones in UTC: (UTC + 14: 00) Pacific / Apia (UTC + 14: 00) Pacific / Kiritimati (UTC + 14: 00) Pacific / Tongatapu (UTC + 14: 00) Enz / GMT-14

6. Java 7 en eerder

Java 8 maakt deze taak gemakkelijker door de Stroom en Datum en tijd API's.

Als we echter een Java 7 hebben en vóór een project, kunnen we nog steeds hetzelfde resultaat bereiken door te vertrouwen op de java.util.TimeZone klasse met zijn getAvailableIDs () methode:

openbare lijst getTimeZoneList (OffsetBase-basis) {String [] availableZoneIds = TimeZone.getAvailableIDs (); Lijstresultaat = nieuwe ArrayList (availableZoneIds.length); voor (String zoneId: availableZoneIds) {TimeZone curTimeZone = TimeZone.getTimeZone (zoneId); String-offset = berekenOffset (curTimeZone.getRawOffset ()); result.add (String.format ("(% s% s)% s", base, offset, zoneId)); } Collections.sort (resultaat); resultaat teruggeven; }

Het belangrijkste verschil met de Java 8-code is de offsetberekening.

De rawOffset we krijgen van Tijdzone()‘S getRawOffset () methode drukt de verschuiving van de tijdzone in milliseconden uit.

Daarom moeten we dit converteren naar uren en minuten met behulp van de TimeUnit klasse:

private String berekenOffset (int rawOffset) {if (rawOffset == 0) {return "+00: 00"; } lange uren = TimeUnit.MILLISECONDS.toHours (rawOffset); lange minuten = TimeUnit.MILLISECONDS.toMinutes (rawOffset); minuten = Math.abs (minuten - TimeUnit.HOURS.toMinutes (uren)); return String.format ("% + 03d:% 02d", uren, Math.abs (minuten)); }

7. Conclusie

In deze korte tutorial hebben we gezien hoe we een lijst kunnen samenstellen van alle beschikbare tijdzones met hun UTC- en GMT-offsets.

En, zoals altijd, is de volledige broncode voor de voorbeelden beschikbaar op GitHub.