Alle Zeitzonen mit GMT und UTC in Java anzeigen

1. Übersicht

Wann immer wir uns mit Zeiten und Daten beschäftigen, brauchen wir einen Referenzrahmen. Der Standard dafür ist UTC, aber wir sehen GMT auch in einigen Anwendungen.

Kurz gesagt, UTC ist der Standard, während GMT eine Zeitzone ist.

Dies sagt uns Wikipedia über die Verwendung:

Für die meisten Zwecke wird UTC als austauschbar mit Greenwich Mean Time (GMT) angesehen, aber GMT wird von der wissenschaftlichen Gemeinschaft nicht mehr genau definiert.

Mit anderen Worten, sobald wir eine Liste mit Zeitzonenversätzen in UTC erstellt haben, haben wir sie auch für GMT.

Zuerst schauen wir uns die Java 8-Methode an, um dies zu erreichen, und dann werden wir sehen, wie wir in Java 7 das gleiche Ergebnis erzielen können.

2. Eine Liste der Zonen abrufen

Zunächst müssen wir eine Liste aller definierten Zeitzonen abrufen.

Zu diesem Zweck verfügt die ZoneId- Klasse über eine praktische statische Methode:

Set availableZoneIds = ZoneId.getAvailableZoneIds();

Dann können wir das Set verwenden , um eine sortierte Liste von Zeitzonen mit ihren entsprechenden Offsets zu generieren:

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

Die obige Methode verwendet einen Enum- Parameter, der den Offset darstellt, den wir sehen möchten:

public enum OffsetBase { GMT, UTC }

Lassen Sie uns nun den Code genauer durchgehen.

Sobald wir alle verfügbaren Zonen-IDs abgerufen haben, benötigen wir eine tatsächliche Zeitreferenz, die durch LocalDateTime.now () dargestellt wird.

Danach verwenden wir die Stream- API von Java , um jeden Eintrag in unseren Zeitzonen- String- IDs zu durchlaufen und ihn in eine Liste formatierter Zeitzonen mit dem entsprechenden Versatz umzuwandeln.

Für jeden dieser Einträge generieren wir eine ZoneId- Instanz mit map (ZoneId :: of).

3. Offsets erhalten

Wir müssen auch tatsächliche UTC-Offsets finden. Im Fall der mitteleuropäischen Zeit wäre der Versatz beispielsweise +01: 00.

Um den UTC-Offset für eine bestimmte Zone zu erhalten, können wir die getOffset () -Methode von LocalDateTime verwenden.

Beachten Sie auch, dass Java +00: 00 Offsets als Z darstellt .

Um einen konsistent aussehenden String für Zeitzonen mit dem Nullpunktversatz zu erhalten, ersetzen wir Z durch +00: 00:

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

4. Zonen vergleichbar machen

Optional können wir die Zeitzonen auch nach Versatz sortieren.

Dazu verwenden wir eine ZoneComparator- Klasse:

private class ZoneComparator implements 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. Zeitzonen anzeigen

Sie müssen nur noch die oben genannten Teile zusammenfügen, indem Sie die Methode getTimeZoneList () für jeden OffsetBase-Enum- Wert aufrufen und die Listen anzeigen:

public class TimezoneDisplayApp { public static void main(String... args) { TimezoneDisplay display = new TimezoneDisplay(); System.out.println("Time zones in UTC:"); List utc = display.getTimeZoneList( TimezoneDisplay.OffsetBase.UTC); utc.forEach(System.out::println); System.out.println("Time zones in GMT:"); List gmt = display.getTimeZoneList( TimezoneDisplay.OffsetBase.GMT); gmt.forEach(System.out::println); } }

Wenn wir den obigen Code ausführen, werden die Zeitzonen für UTC und GMT gedruckt.

Hier ist ein Ausschnitt davon, wie die Ausgabe aussehen wird:

Time zones in 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 und früher

Java 8 erleichtert diese Aufgabe durch die Verwendung der Stream- und Datums- und Uhrzeit- APIs.

Wenn wir jedoch Java 7 haben und vor einem Projekt, können wir immer noch das gleiche Ergebnis erzielen, indem wir uns auf die Klasse java.util.TimeZone mit ihrer Methode getAvailableIDs () verlassen :

public List getTimeZoneList(OffsetBase base) { String[] availableZoneIds = TimeZone.getAvailableIDs(); List result = new ArrayList(availableZoneIds.length); for (String zoneId : availableZoneIds) { TimeZone curTimeZone = TimeZone.getTimeZone(zoneId); String offset = calculateOffset(curTimeZone.getRawOffset()); result.add(String.format("(%s%s) %s", base, offset, zoneId)); } Collections.sort(result); return result; }

Der Hauptunterschied zum Java 8-Code ist die Offset-Berechnung.

Die rawOffset wir Suche von Time - Zone () ‚s getRawOffset () Methode drückt die Zeitzone des in Millisekunden versetzt .

Daher müssen wir dies mit der TimeUnit- Klasse in Stunden und Minuten konvertieren :

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

7. Fazit

In diesem kurzen Tutorial haben wir gesehen, wie wir eine Liste aller verfügbaren Zeitzonen mit ihren UTC- und GMT-Offsets erstellen können.

Und wie immer ist der vollständige Quellcode für die Beispiele auf GitHub verfügbar.