Alle Zeitzonen mit GMT und UTC in Java anzeigen

Alle Zeitzonen mit GMT und UTC in Java anzeigen

1. Überblick

Wann immer wir uns mit Zeiten und Daten befassen, brauchen wir einen Bezugsrahmen. Der Standard dafür istUTC, aber wir sehen in einigen Anwendungen auchGMT.

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

Dies sagt uns Wikipedia in Bezug auf die Verwendung:

In den meisten Fällen wird UTC als austauschbar mit der Greenwich Mean Time (GMT) angesehen, aber die 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 werden wir uns die Java 8-Methode ansehen, 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 KlasseZoneIdüber eine praktische statische Methode:

Set availableZoneIds = ZoneId.getAvailableZoneIds();

Dann können wir dieSet 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 einenenum-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, dargestellt durchLocalDateTime.now().

Danach verwenden wir dieStream-API von Java, um jeden Eintrag in unserer Gruppe vonString-IDs der Zeitzone zu durchlaufen und ihn in eine Liste formatierter Zeitzonen mit dem entsprechenden Versatz umzuwandeln.

Für jeden dieser Einträge generieren wir eineZoneId-Instanz mitmap(ZoneId::of).

3. Offsets erhalten

Wir müssen auch die tatsächlichen 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 MethodeLocalDateTime’s getOffset()verwenden.

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

Um ein konsistent aussehendesString für Zeitzonen mit dem Nullpunktversatz zu erhalten, ersetzen wirZ durch+00:00:

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

4. Zonen erstellenComparable

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

Dazu verwenden wir eineZoneComparator-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 diegetTimeZoneList()-Methode für jedenOffsetBase 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 APIsStream undDate and Time.

Wenn wir jedoch Java 7 haben und vor einem Projekt, können wir immer noch das gleiche Ergebnis erzielen, indem wir uns auf die Klassejava.util.TimeZonemit ihrer MethodegetAvailableIDs()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.

DierawOffset erhalten wir vonTimeZone()‘s getRawOffset() method expresses the time zone’s offset in milliseconds.

Daher müssen wir dies mit der KlasseTimeUnit 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 Beispieleover on GitHub verfügbar.