codestory

Die Anleitung zu Java ZoneId

  1. ZoneId
  2. Type1: Region-based ZoneId
  3. Type2: Offset-based ZoneId
  4. Type3: UTC, GMT, UT ZoneId
  5. ZoneId methods
  6. systemDefault()
  7. of(String)
  8. of(String, Map<String, String>)
  9. ofOffset(String, ZoneOffset)
  10. from(TemporalAccessor)
  11. getAvailableZoneIds()
  12. getRules()
  13. normalized()

1. ZoneId

Die Klasse ZoneId wird verwendet, um eine Zeitzone zu identifizieren und die Konvertierungsregeln zwischen LocalDateTime und Instant bereitzustellen. In Bezug auf Offset-Regeln wird ZoneId in 2 Typen unterteilt:
  • ZoneId mit einem festen Zeitzonen-Offset, wie "UTC+07", "GMT-05:40", "UT-03", "+05:50".
  • ZoneId mit einem nicht festen Zeitzonen-Offset, wie "Europe/Paris". Sein Zeitzonen-Offset hängt von der Zeit auf der Zeitleiste oder vom Tag des Jahres ab.
ZoneId.of("Asia/Ho_Chi_Minh") ist beispielsweise die Zeitzonenkennung von Südvietnam. Während des Zeitraums von 1960 bis vor dem 13. Juni 1975 betrug der Zeitzonenversatz dieser ZoneId+8, wurde aber später auf +7 geändert, um sich mit Nordvietnam zu vereinigen.
ZoneId
public abstract class ZoneId implements Serializable {
     public abstract String getId();  
     public abstract ZoneRules getRules();
     ...
}
Obwohl ZoneId eine abstrakte Klasse ist, bietet sie einige statische Factory-Methoden zum Erstellen von Objekten ZoneId. Zwei wichtige Eigenschaften von ZoneId sind id und rules.
  • String id: Die ID ist eindeutig.
  • ZoneRules rules: Regeln zum Bestimmen des Zeitzonen-Offsets zu einem bestimmten Zeitpunkt auf der Timeline.
Die Klasse ZoneOffset ist eine Unterklasse von ZoneId.
Basierend auf der Syntax von ID wird ZoneId in 3 Typen unterteilt:
Type
Example
getId()
Type1
Region-based ZoneId
ZoneId.of("Europe/Paris")
Europe/Paris
Type2
Offset-based ZoneId
ZoneOffset.of("-06")
-06
Type2
Offset-based ZoneId
ZoneOffset.of("+06:05:20")
+06:05:20
Type3
UTC/GMT/UT ZoneId
ZoneId.ofOffset("UTC", ZoneOffset.of("+06"))
UTC+06
Type3
UTC/GMT/UT ZoneId
ZoneId.of("GMT-06:05:20")
GMT-06:05:20

2. Type1: Region-based ZoneId

Region-based ZoneId (ZonedId basiert auf die Region), der Wert des Parameters zoneId muss aus 2 oder mehr Zeichen bestehen und darf nicht mit "UTC", "GMT", "UT", "+", "-" beginnen. Es werden viele Werte bereitgestellt, wie zB "Europe/Paris", "Asia/Ho_Chi_Minh",... Die statische Methode ZoneId.getAvailableZoneIds() gibt eine Menge dieser zoneId zurück.
public static ZoneId of(String zoneId)
Sie können auch ein geografisches Gebiet definieren und Regeln dafür über den ZoneRulesProvider bereitstellen.
  • Die Anleitung zu Java ZoneRulesProvider
Zum Beispiel:
ZoneId_region_based_ex1.java
ZoneId zoneId1 = ZoneId.of("Europe/Paris");  
ZoneId zoneId2 = ZoneId.of("Asia/Ho_Chi_Minh");  

System.out.println(zoneId1.getId()); // Europe/Paris
System.out.println(zoneId2.getId()); // Asia/Ho_Chi_Minh

// Show format of Zoned Date Time
ZonedDateTime zonedDateTime = ZonedDateTime.of(2021, 6, 22, 0, 0, 0, 0, zoneId2);
System.out.println("zonedDateTime: " + zonedDateTime); // 2021-06-22T00:00+07:00[Asia/Ho_Chi_Minh]
Region-based ZoneId enthält historische Daten zu Zeitzonen-Offsets. Schauen wir eine Situation an:
Am 1. Januar 1986 gab die nepalesische Regierung ihre Zeitzone als +5h45 GMT bekannt. Damit sind sie 15 Minuten schneller als das benachbarte Indien. Dieser Schritt soll bei dem riesigen Nachbarn etwas bewirken und den Nationalstolz des nepalesischen Volkes zeigen.
Nepals Zeitzonen-ID lautet "Asia/Kathmandu". Das folgende Beispiel zeigt, dass ZoneId.of("Asia/Kathmandu") bereits historische Daten enthält:
ZoneId_nepal_ex1.java
package org.o7planning.zoneid.type.ex;

import java.time.ZoneId;
import java.time.ZonedDateTime;

public class ZoneId_nepal_ex1 {

    public static void main(String[] args) {
        ZoneId nepalZoneId = ZoneId.of("Asia/Kathmandu");

        ZonedDateTime zdt1 = ZonedDateTime.of(1985, 12, 30, 0, 0, 0, 0, nepalZoneId);
        System.out.println(zdt1); // 1985-12-30T00:00+05:30[Asia/Kathmandu]

        System.out.println();

        ZonedDateTime zdt2 = ZonedDateTime.of(1986, 1, 1, 0, 0, 0, 0, nepalZoneId);
        System.out.println(zdt2); // 1986-01-01T00:15+05:45[Asia/Kathmandu]
    }
}
Output:
1985-12-30T00:00+05:30[Asia/Kathmandu]

1986-01-01T00:15+05:45[Asia/Kathmandu]
In Fortsetzung des obigen Beispiels überprüfen wir die Zeitzonen-Offset-Informationen von RoleRules:
ZoneId_nepal_ex2.java
ZoneId nepalZoneId = ZoneId.of("Asia/Kathmandu");

ZoneRules rules = nepalZoneId.getRules();

LocalDateTime ldt1 = LocalDateTime.of(1985, 12, 30, 0, 0, 0, 0);
ZoneOffset offset1 = rules.getOffset(ldt1);
System.out.println(offset1); // +05:30

LocalDateTime ldt2 = LocalDateTime.of(1986, 1, 1, 0, 15, 0, 0);
ZoneOffset offset2 = rules.getOffset(ldt2);  
System.out.println(offset2); // +05:45

3. Type2: Offset-based ZoneId

// Static method of ZoneOffset class.
public static ZoneOffset of(String offsetId)

public static ZoneOffset ofHours(int hours)  
public static ZoneOffset ofHoursMinutes(int hours, int minutes)  
public static ZoneOffset ofHoursMinutesSeconds(int hours, int minutes, int seconds)
public static ZoneOffset ofTotalSeconds(int totalSeconds)
Offset-based ZoneId (Zoneld basiert auf die Zeitversatz): Diese Zeitzonen-ID(s) beginnen mit "+" oder "-". Der Parameter offsetId muss das folgende Format haben:
  • Z - for UTC
  • +h
  • +hh
  • +hh:mm
  • -hh:mm
  • +hhmm
  • -hhmm
  • +hh:mm:ss
  • -hh:mm:ss
  • +hhmmss
  • -hhmmss
Zum Beispiel:
ZoneId_offset_based_ex1.java
ZoneId zoneId1 = ZoneOffset.of("-06");
ZoneId zoneId2 = ZoneOffset.of("+06:05:20");
ZoneId zoneId3 = ZoneOffset.ofHoursMinutes(9, 45);

System.out.println(zoneId1.getId()); // -06:00
System.out.println(zoneId2.getId()); // +06:05:20
System.out.println(zoneId3.getId()); // +09:45

// Show format of Zoned Date Time:
ZonedDateTime zonedDateTime = ZonedDateTime.of(2021, 6, 22, 0, 0, 0, 0, zoneId2);
System.out.println("zonedDateTime: " + zonedDateTime); // 2021-06-22T00:00+06:05:20
Ihre Zeitzonen-Offsets sind fest:
ZoneId_offset_based_ex2.java
ZoneId zoneId = ZoneOffset.of("+07:05:30");

System.out.println(zoneId.getId()); // +07:05:30

ZoneRules zoneRules = zoneId.getRules();
ZoneOffset zoneOffset = zoneRules.getOffset(Instant.now());
System.out.println("zoneOffset: " + zoneOffset.getId()); // +07:05:30
  • ZoneOffset
  • ZoneRules

4. Type3: UTC, GMT, UT ZoneId

UTC, GMT, UT ZoneId: Zeitzonen-ID(s) dieses Typs beginnen mit "UTC", "GMT" oder "UT", gefolgt von "+" oder "-".
public static ZoneId ofOffset(String prefix, ZoneOffset offset)

public static ZoneId of(String zoneId)
  • GMT vs UTC
Zum Beispiel:
ZoneId_gmt_utc_ut_ex1.java
ZoneId z31 = ZoneId.ofOffset("UTC", ZoneOffset.of("+06"));
ZoneId z32 = ZoneId.ofOffset("GMT", ZoneOffset.of("-06:05:20"));
ZoneId z33 = ZoneId.ofOffset("UT", ZoneOffset.of("+05:20"));

System.out.println(z31.getId()); // UTC+06:00
System.out.println(z32.getId()); // GMT-06:05:20
System.out.println(z33.getId()); // UT+05:20   

// Parser:
ZoneId z31b = ZoneId.of("UTC+06:00");
ZoneId z32b = ZoneId.of("GMT-06:05:20");
ZoneId z33b = ZoneId.of("UT+05:20");

System.out.println(z31b.getId()); // UTC+06:00
System.out.println(z32b.getId()); // GMT-06:05:20
System.out.println(z33b.getId()); // UT+05:20
Output:
UTC+06:00
GMT-06:05:20
UT+05:20
UTC+06:00
GMT-06:05:20
UT+05:20
UTC, GMT, UT-Zeitzonen-ID(s) haben einen festen Zeitzonen-Offset.
ZoneId_gmt_utc_ut_ex2.java
ZoneId zoneId = ZoneId.ofOffset("GMT", ZoneOffset.of("+09"));
System.out.println(zoneId); // GMT+09:00

ZoneRules zoneRules = zoneId.getRules();
System.out.println("isFixedOffset? " + zoneRules.isFixedOffset()); // true

ZoneOffset zoneOffset = zoneRules.getOffset(Instant.now());
System.out.println("zoneOffset: " + zoneOffset); // +09:00

// Show format of Zoned Date Time.
ZonedDateTime zonedDateTime = ZonedDateTime.of(2021, 6, 22, 0, 0, 0, 0, zoneId);
System.out.println("zonedDateTime: " + zonedDateTime); // 2021-06-22T00:00+09:00[GMT+09:00]
Output:
GMT+09:00
isFixedOffset? true
zoneOffset: +09:00
zonedDateTime: 2021-06-22T00:00+09:00[GMT+09:00]

5. ZoneId methods

Statische Fabrikmethoden:
public static ZoneId systemDefault()    
public static ZoneId from(TemporalAccessor temporal)  
public static ZoneId of(String zoneId, Map<String, String> aliasMap)  
public static ZoneId of(String zoneId)  
public static ZoneId ofOffset(String prefix, ZoneOffset offset)
Die weiteren Methode:
public static Set<String> getAvailableZoneIds()  
public abstract String getId()  
public String getDisplayName(TextStyle style, Locale locale)  
public abstract ZoneRules getRules();
public ZoneId normalized()

6. systemDefault()

Gibt die Standardzeitzone des Systems zurück. Auf Betriebssystemen wie Windows, Linux, Mac OS können Sie die Standardzeitzone des Systems ändern.
public static ZoneId systemDefault()
Diese Methode ruft die Methode TimeZone.getDefault() auf und konvertiert das Ergebnis in eine ZoneId. Wenn sich die Systemzeitzone ändert, ändert sich auch das von dieser Methode zurückgegebene Ergebnis.
Zum Beispiel:
ZoneId zoneId = ZoneId.systemDefault();

System.out.println(zoneId);
Output:
Asia/Bishkek

7. of(String)

Geben Sie ein Objekt ZoneId zurück, indem Sie im System nach einer verfügbaren ZoneId suchen, die der angegebenen Zeichenfolge ZoneId entspricht. Wenn es nicht gefunden wird, wird die Zeichenfolge ZoneId analysiert, um ein Objekt ZoneOffset zu erstellen (Hinweis: ZoneOffset ist eine Unterklasse von ZoneId).
public static ZoneId of(String zoneId)
Case 1:
ZoneId(s) sind im System in Bezug auf ein bestimmtes geografisches Gebiet vordefiniert. Sie können diesen Satz von ZoneId(s) über die Methode ZoneId.getAvailableZoneIds() abrufen.
  • Asia/Bishkek
  • Europe/Paris
  • ...
ZoneId_of_ex1.java
// ZoneId from region ID
ZoneId zoneId1 = ZoneId.of("Europe/Paris");
System.out.println("zoneId1: " + zoneId1); // Europe/Paris

ZoneId zoneId2 = ZoneId.of("America/Chicago");
System.out.println("zoneId2: " + zoneId2); // America/Chicago
Case 2:
Wenn der Parameter zoneId"Z" ist, ist das Ergebnis ZoneOffset.UTC. Andernfalls, wenn der Parameter zoneId nur ein Zeichen und kein "Z" ist, wird er als ungültig betrachtet und eine DateTimeException wird ausgelöst.
ZoneId_of_ex2.java
ZoneId zoneId = ZoneId.of("Z"); // return ZoneOffset.UTC
System.out.println("ZoneId.of('Z'): " + zoneId); // Z
System.out.println("ZoneOffset.UTC: " + ZoneOffset.UTC); // Z

boolean same = zoneId == ZoneOffset.UTC;  
System.out.println("ZoneId.of('Z') == ZoneOffset.UTC? " + same); // true
Case 3:
Wenn der Parameter zoneId mit "+" oder "-" beginnt, wird er von der Methode ZoneOffset.of(zoneId) als ZoneOffset geparst.
ZoneId_of_ex3.java
ZoneId zoneId = ZoneId.of("+09:30");
ZoneOffset zoneOffset1 = (ZoneOffset) zoneId;

// Same as:
ZoneOffset zoneOffset2 = ZoneOffset.of("+09:30");

System.out.println("zoneId: " + zoneId); // +09:30
System.out.println("zoneOffset: " + zoneOffset2); // +09:30
System.out.println("zoneOffset1.equals(zoneOffset2)? " + zoneOffset1.equals(zoneOffset2)); // true
Case 4:
Wenn der Parameter zoneId"UTC", "GMT" oder "UT" ist, gibt die Methode ein Objekt ZoneId mit denselben ZoneRules wie ZoneOffset.UTC zurück.
ZoneId_of_ex4.java
ZoneId zoneId = ZoneOffset.UTC;

ZoneId zoneId1 = ZoneId.of("UTC");
ZoneId zoneId2 = ZoneId.of("GMT");
ZoneId zoneId3 = ZoneId.of("UT");

// Print out Zone-ID
System.out.println(zoneId.getId());  // Z
System.out.println(zoneId1.getId()); // UTC
System.out.println(zoneId2.getId()); // GMT
System.out.println(zoneId3.getId()); // UT

ZoneRules rules = zoneId.getRules();
ZoneRules rules1 = zoneId1.getRules();
ZoneRules rules2 = zoneId2.getRules();
ZoneRules rules3 = zoneId3.getRules();

System.out.println(rules);  // ZoneRules[currentStandardOffset=Z]
System.out.println(rules1); // ZoneRules[currentStandardOffset=Z]
System.out.println(rules2); // ZoneRules[currentStandardOffset=Z]
System.out.println(rules3); // ZoneRules[currentStandardOffset=Z]

System.out.println("rules1.equals(rules): " + rules1.equals(rules)); // true
System.out.println("rules2.equals(rules): " + rules2.equals(rules)); // true
System.out.println("rules3.equals(rules): " + rules3.equals(rules)); // true
Case 5:
Wenn der Parameter zoneId mit "UTC+", "UTC-", "GMT+", "GMT-", "UT+", "UT-" beginnt, wird ein Objekt ZoneId zurückgegeben. Der Parameter zoneId, der "GMT+09:30" entspricht, würde beispielsweise ZoneId.ofOffset("GMT",ZoneOffset.of("+09:30")) entsprechen.
ZoneId_of_ex5.java
// UTC
ZoneId zoneId1a = ZoneId.of("UTC+09:30");
ZoneId zoneId1b = ZoneId.ofOffset("UTC", ZoneOffset.of("+09:30"));
ZoneId zoneId1c = ZoneId.ofOffset("UTC", ZoneOffset.ofHoursMinutes(9, 30));
System.out.println(zoneId1a); // UTC+09:30
System.out.println(zoneId1b); // UTC+09:30
System.out.println(zoneId1c); // UTC+09:30

// GMT
ZoneId zoneId2a = ZoneId.of("GMT+05:30:20");
ZoneId zoneId2b = ZoneId.ofOffset("GMT", ZoneOffset.of("+05:30:20"));
ZoneId zoneId2c = ZoneId.ofOffset("GMT", ZoneOffset.ofHoursMinutesSeconds(5, 30, 20));
System.out.println(zoneId2a); // GMT+05:30:20
System.out.println(zoneId2b); // GMT+05:30:20
System.out.println(zoneId2c); // GMT+05:30:20

// UT
ZoneId zoneId3a = ZoneId.of("UT-07");
ZoneId zoneId3b = ZoneId.ofOffset("UT", ZoneOffset.of("-07"));
ZoneId zoneId3c = ZoneId.ofOffset("UT", ZoneOffset.ofHours(-7));
System.out.println(zoneId3a); // UT-07:00
System.out.println(zoneId3b); // UT-07:00
System.out.println(zoneId3c); // UT-07:00

8. of(String, Map<String, String>)

public static ZoneId of(String zoneId, Map<String, String> aliasMap)
Zum Beispiel:
ZoneId_of_aliasMap_ex1.java
package org.o7planning.zoneid.fm;

import java.time.ZoneId;
import java.util.HashMap;
import java.util.Map;

public class ZoneId_of_aliasMap_ex1 {

    public static void main(String[] args) {
        // Alias IDs:
        Map<String, String> aliasMap = new HashMap<>();
        aliasMap.put("hcm", "Asia/Ho_Chi_Minh");
        aliasMap.put("usc", "US/Central");
        aliasMap.put("prs", "Europe/Paris");

        ZoneId frZoneId = ZoneId.of("prs", aliasMap);
        ZoneId vnZoneId = ZoneId.of("hcm", aliasMap);
        ZoneId usZoneId = ZoneId.of("US/Central", aliasMap);
        ZoneId jpZoneId = ZoneId.of("Asia/Tokyo", aliasMap);
        ZoneId os9ZoneId = ZoneId.of("+09", aliasMap);

        System.out.println(frZoneId); // Europe/Paris
        System.out.println(vnZoneId); // Asia/Ho_Chi_Minh
        System.out.println(usZoneId); // US/Central
        System.out.println(jpZoneId); // Asia/Tokyo
        System.out.println(os9ZoneId); // +09:00

        System.out.println(" ------ ");

        // throws ZoneRulesException - Unknown time-zone ID: xx
        ZoneId xxZoneId = ZoneId.of("xx", aliasMap); // throws ZoneRulesException

        System.out.println(xxZoneId);
    }
}
Output:
Europe/Paris
Asia/Ho_Chi_Minh
US/Central
Asia/Tokyo
+09:00
 ------
Exception in thread "main" java.time.zone.ZoneRulesException: Unknown time-zone ID: xx
    at java.base/java.time.zone.ZoneRulesProvider.getProvider(ZoneRulesProvider.java:279)
    at java.base/java.time.zone.ZoneRulesProvider.getRules(ZoneRulesProvider.java:234)
    at java.base/java.time.ZoneRegion.ofId(ZoneRegion.java:120)
    at java.base/java.time.ZoneId.of(ZoneId.java:408)
    at java.base/java.time.ZoneId.of(ZoneId.java:356)
    at java.base/java.time.ZoneId.of(ZoneId.java:312)
    at org.o7planning.zoneid.fm.ZoneId_of_aliasMap_ex1.main(ZoneId_of_aliasMap_ex1.java:31)
ZoneId_of_aliasMap_ex2.java
package org.o7planning.zoneid.fm;

import java.time.ZoneId;
import java.util.Map;

public class ZoneId_of_aliasMap_ex2 {

    public static void main(String[] args) {
        // Alias IDs:
        Map<String, String> aliasMap = ZoneId.SHORT_IDS;

        aliasMap.forEach((k, v) -> System.out.println(k + " --> " + v));

        System.out.println(" ------ ");

        ZoneId zoneId1 = ZoneId.of("JST", aliasMap);
        ZoneId zoneId2 = ZoneId.of("VST", aliasMap);  

        System.out.println(zoneId1); // Asia/Tokyo
        System.out.println(zoneId2); // Asia/Ho_Chi_Minh
    }
}
Output:
NET --> Asia/Yerevan
CST --> America/Chicago
IST --> Asia/Kolkata
AET --> Australia/Sydney
BST --> Asia/Dhaka
ACT --> Australia/Darwin
HST --> -10:00
NST --> Pacific/Auckland
AST --> America/Anchorage
MST --> -07:00
SST --> Pacific/Guadalcanal
CTT --> Asia/Shanghai
PRT --> America/Puerto_Rico
ECT --> Europe/Paris
EAT --> Africa/Addis_Ababa
EST --> -05:00
PNT --> America/Phoenix
PLT --> Asia/Karachi
CNT --> America/St_Johns
IET --> America/Indiana/Indianapolis
VST --> Asia/Ho_Chi_Minh
JST --> Asia/Tokyo
ART --> Africa/Cairo
PST --> America/Los_Angeles
BET --> America/Sao_Paulo
MIT --> Pacific/Apia
CAT --> Africa/Harare
AGT --> America/Argentina/Buenos_Aires
 ------
Asia/Tokyo
Asia/Ho_Chi_Minh

9. ofOffset(String, ZoneOffset)

Der Parameter prefix kann nur einen von vier Werten annehmen: "UTC", "GMT", "UT", "".
public static ZoneId ofOffset(String prefix, ZoneOffset offset)
Zum Beispiel:
ZoneId_ofOffset_ex1.java
ZoneId zoneId1 = ZoneId.ofOffset("UTC", ZoneOffset.ofHours(9));
ZoneId zoneId2 = ZoneId.ofOffset("GMT", ZoneOffset.ofHoursMinutes(9, 30));
ZoneId zoneId3 = ZoneId.ofOffset("UT", ZoneOffset.ofHours(-7));

ZoneId zoneId4 = ZoneId.ofOffset("", ZoneOffset.ofHours(-5)); // Can cast to ZoneOffset

System.out.println(zoneId1); // UTC+09:00
System.out.println(zoneId2); // GMT+09:30
System.out.println(zoneId3); // UT-07:00
System.out.println(zoneId4); // -05:00
  • Die Anleitung zu Java ZoneOffset

10. from(TemporalAccessor)

Gibt das Objekt ZoneId zurück, das dem angegebenen Objekt TemporalAccessor zugeordnet ist.
public static ZoneId from(TemporalAccessor temporal)
Zum Beispiel:
ZoneId_from_ex1.java
package org.o7planning.zoneid.fm;

import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.temporal.TemporalAccessor;

public class ZoneId_from_ex1 {

    public static void main(String[] args) {
        // Obtains the current date-time from the system clock in the default time-zone.
        TemporalAccessor temporalAccessor = ZonedDateTime.now();
        System.out.println("ZonedDateTime: " + temporalAccessor);

        ZoneId zoneId = ZoneId.from(temporalAccessor);
        System.out.println("zoneId: " + zoneId);
    }
}
Output:
ZonedDateTime: 2021-06-24T21:34:23.518679+06:00[Asia/Bishkek]
zoneId: Asia/Bishkek

11. getAvailableZoneIds()

No ADS
Gibt ein Set<String> zurück, das alle verfügbaren Zeitzonen-IDs im System enthält. Die Anzahl der Elemente kann im Laufe der Zeit zunehmen, aber in gängigen Anwendungen hat sie normalerweise eine feste Größe. Diese Methode ist Thread-sicher.
  • Alle Region-based ZoneId einschließen.
  • Offset-based ZoneId nicht einschließen.
public static Set<String> getAvailableZoneIds()
Zum Beispiel:
ZoneId_getAvailableZoneIds_ex1.java
package org.o7planning.zoneid.ex;

import java.time.ZoneId;
import java.util.Set;

public class ZoneId_getAvailableZoneIds_ex1 {

    public static void main(String[] args) {
        Set<String> zoneIds = ZoneId.getAvailableZoneIds();

        for (String zoneId : zoneIds) {
           System.out.println(zoneId);
        }
    }
}
Output:
Asia/Aden
America/Cuiaba
...
America/Sao_Paulo
Asia/Jayapura
America/Curacao
Asia/Dushanbe
America/Guyana
...
UTC
...
GMT0
...
Europe/Nicosia
Pacific/Guadalcanal
Europe/Athens
US/Pacific
Europe/Monaco

12. getRules()

No ADS
Gibt ein Objekt ZoneRules zurück, das die Zeitzonenregeln (time-zone rules) dieser ZoneId darstellt.
public abstract ZoneRules getRules()
Der Zeitzonen-Offset in ZoneRules, der von einer Region-based ZoneId abgerufen wird, ist nicht festgelegt. Es hängt von der bestimmten Zeit oder von der Jahreszeit ab.
Beispiel: ZoneId.of("Asia/Ho_Chi_Minh") ist die Zeitzone von Südvietnam. Von 1960 bis vor dem 13. Juni 1975 verwendete diese ZoneId die Zeitzone +8 und wurde dann in die Zeitzone +7 geändert, um sich mit Nordvietnam zu vereinigen.
ZoneId_getRules_ex1.java
package org.o7planning.zoneid.ex;

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.zone.ZoneRules;

public class ZoneId_getRules_ex1 {

    public static void main(String[] args) {
        ZoneId zoneId = ZoneId.of("Asia/Ho_Chi_Minh");
        ZoneRules zoneRules = zoneId.getRules();
        
        ZoneOffset zoneOffset1 = zoneRules.getOffset(LocalDateTime.of(1975, 6, 12, 0, 0, 0));
        ZoneOffset zoneOffset2 = zoneRules.getOffset(LocalDateTime.of(1975, 6, 13, 0, 0, 0));
        
        System.out.println("zoneOffset1: " + zoneOffset1); // +08:00
        System.out.println("zoneOffset2: " + zoneOffset2); // +07:00
    }
}
Output:
zoneOffset1: +08:00
zoneOffset2: +07:00
Sie können auch eine ZoneId mit benutzerdefinierten Zeitzonenregeln durch den ZoneRulesProvider erstellen:
  • ZoneRulesProvider
  • ZoneRules

13. normalized()

No ADS
Die Methode normalized() gibt eine normalisierte ZoneId zurück. Grundsätzlich prüft es, ob der Zeitzonen-Offset dieser ZoneId fest ist oder nicht. Wenn festgelegt, wird ZoneOffset zurückgegeben, andernfalls wird diese ZoneId zurückgegeben.
public ZoneId normalized()
Zum Beispiel:
ZoneId_normalized_ex1.java
package org.o7planning.zoneid.ex;

import java.time.ZoneId;

public class ZoneId_normalized_ex1 {

    public static void main(String[] args) {
        ZoneId zoneId1 = ZoneId.of("US/Central");
        System.out.println("zoneId1: " + zoneId1); // US/Central
        System.out.println("zoneId1.normalized(): " + zoneId1.normalized()); // US/Central

        ZoneId zoneId2 = ZoneId.of("Asia/Tokyo");
        System.out.println("\nzoneId2: " + zoneId2); // Asia/Tokyo
        System.out.println("zoneId2.normalized(): " + zoneId2.normalized()); // Asia/Tokyo

        ZoneId zoneId3 = ZoneId.of("UTC-09:30");
        System.out.println("\nzoneId3: " + zoneId3); // UTC-09:30
        System.out.println("zoneId3.normalized(): " + zoneId3.normalized()); // -09:30
    }
}
Output:
zoneId1: US/Central
zoneId1.normalized(): US/Central

zoneId2: Asia/Tokyo
zoneId2.normalized(): Asia/Tokyo

zoneId3: UTC-09:30
zoneId3.normalized(): -09:30
No ADS