devstory

Le Tutoriel de 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

La classe ZoneId est utilisée pour identifier un fuseau horaire et fournir les règles de conversion entre LocalDateTime et Instant. En termes de règles de décalage (offset rules), ZoneId est divisée en 2 types :
  • ZoneId avec un décalage de fuseau horaire fixe, tel que "UTC+07", "GMT-05:40", "UT-03", "+05:50".
  • ZoneId avec un décalage de fuseau horaire non fixe, tel que "Europe/Paris". Son décalage de fuseau horaire dépend de l'heure sur la chronologie ou dépend du jour de l'année.
Par exemple, ZoneId.of("Asia/Ho_Chi_Minh") est l'identifiant de fuseau horaire du sud du Vietnam. Au cours de la période allant de 1960 à avant le 13 juin 1975, le décalage de fuseau horaire de cette ZoneId était de +8, mais est ensuite passé à +7 pour s'accorder avec le nord du Vietnam.
ZoneId
public abstract class ZoneId implements Serializable {
     public abstract String getId();  
     public abstract ZoneRules getRules();
     ...
}
Bien que ZoneId soit une classe abstraite, elle fournit quelques méthodes de fabrique statiques pour créer des objets ZoneId. Deux propriétés importantes de ZoneId sont id et rules.
  • String id: l'ID est unique.
  • ZoneRules rules: Les règles permettant de déterminer le décalage de fuseau horaire à un moment précis de la chronologie.
La classe ZoneOffset est une sous-classe de ZoneId.
Basée sur la syntaxe de l'ID, ZoneId est divisée en 3 types :
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 (ZoneId basée sur la région), la valeur du paramètre zoneId doit comporter 2 caractères ou plus et ne doit pas commencer par "UTC", "GMT", "UT", "+", "- ". De nombreuses valeurs sont fournies, telles que "Europe/Paris", "Asia/Ho_Chi_Minh",... La méthode statique ZoneId.getAvailableZoneIds() renvoie un ensemble de ces zoneId(s).
public static ZoneId of(String zoneId)
Vous pouvez également définir une zone géographique et lui fournir des règles via la ZoneRulesProvider.
  • Le Tutoriel de Java ZoneRulesProvider
Par exemple :
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 contient des données historiques sur les décalages de fuseau horaire. Observer une situation :
Le 1er janvier 1986, le gouvernement népalais a annoncé son fuseau horaire à +5:45 GMT. Cela signifie qu'ils sont à 15 minutes plus rapides que l'Inde voisine. Ce changement est destiné à faire la différence avec le voisin géant et à démontrer la fierté nationale du peuple népalais.
L'ID du fuseau horaire du Népal est "Asia/Kathmandu". L'exemple ci-dessous montre que ZoneId.of("Asia/Kathmandu") contient déjà des données historiques :
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]
En continuant avec l'exemple ci-dessus, on passe en revue les informations de décalage de fuseau horaire de 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 (ZoneId basé sur le décalage) : ces ID de fuseau horaire commencent par "+" ou "-". Le paramètre offsetId doit avoir le format suivant :
  • Z - for UTC
  • +h
  • +hh
  • +hh:mm
  • -hh:mm
  • +hhmm
  • -hhmm
  • +hh:mm:ss
  • -hh:mm:ss
  • +hhmmss
  • -hhmmss
Par exemple :
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
Leurs décalages de fuseau horaire sont fixes :
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: Les ID de fuseau horaire de ce type commencent par "UTC", "GMT" ou "UT" suivi de "+" ou "-".
public static ZoneId ofOffset(String prefix, ZoneOffset offset)

public static ZoneId of(String zoneId)
  • GMT vs UTC
Par exemple :
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
Les ID de fuseau horaire UTC, GMT et UT ont un décalage de fuseau horaire fixe.
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

Les méthodes de fabrique statiques:
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)
Les autres méthodes :
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()

Renvoyer le fuseau horaire par défaut du système. Sur les systèmes d'exploitation tels que Windows, Linux, Mac OS, tous vous permettent de modifier le fuseau horaire par défaut du système.
public static ZoneId systemDefault()
Cette méthode convoque la méthode TimeZone.getDefault() et convertit le résultat en une ZoneId. Si le fuseau horaire du système change, le résultat renvoyé par cette méthode change également.
Par exemple :
ZoneId zoneId = ZoneId.systemDefault();

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

7. of(String)

Renvoyer un objet ZoneId en recherchant une ZoneId disponible dans le système correspondant à la chaîne zoneId donnée. S'il n'est pas trouvé, il analysera la chaîne zoneId pour créer un objet ZoneOffset (Remarque : ZoneOffset est une sous-classe de ZoneId).
public static ZoneId of(String zoneId)
Case 1:
ZoneId(s) sont prédéfinies dans le système liés à une zone géographique spécifique. Vous pouvez obtenir cet ensemble de ZoneId(s) à partir de la méthode ZoneId.getAvailableZoneIds().
  • 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:
Si le paramètre zoneId est "Z", le résultat est ZoneOffset.UTC. Sinon, si le paramètre zoneId est un seul caractère et autre que "Z", il est considéré comme invalide et une DateTimeException sera levée.
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:
Si le paramètre zoneId commence par "+" ou "-", il sera analysé comme un ZoneOffset par la méthode ZoneOffset.of(zoneId).
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:
Si le paramètre zoneId est "UTC", "GMT" ou "UT", la méthode renvoie un objet ZoneId avec les mêmes ZoneRules que ZoneOffset.UTC.
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:
Si le paramètre zoneId commence par "UTC+", "UTC-", "GMT+", "GMT-", "UT+", "UT-", un objet ZoneId est renvoyé. Par exemple, le paramètre zoneId égal à "GMT+09:30" serait équivalent à ZoneId.ofOffset("GMT",ZoneOffset.of("+09:30")).
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)
Par exemple :
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)

Le paramètre prefix ne peut prendre qu'une des quatre valeurs : "UTC", "GMT", "UT", "".
public static ZoneId ofOffset(String prefix, ZoneOffset offset)
Par exemple :
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
  • Le Tutoriel de Java ZoneOffset

10. from(TemporalAccessor)

Renvoyer l'objet ZoneId associé à l'objet TemporalAccessor donné.
public static ZoneId from(TemporalAccessor temporal)
Par exemple :
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()

Renvoyer un Set<String> contenant tous les ID(s) de fuseau horaire disponibles dans le système. Son nombre d'éléments peut augmenter avec le temps, mais dans les applications courantes, il s'agit généralement d'une taille fixe. Cette méthode est thread-safe.
  • Inclure toutes les Region-based ZoneId.
  • Exclure la Offset-based ZoneId.
public static Set<String> getAvailableZoneIds()
Par exemple :
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()

Renvoyer un objet ZoneRules représentant les règles de fuseau horaire (time-zone rules) de cette ZoneId.
public abstract ZoneRules getRules()
Le décalage de fuseau horaire dans ZoneRules obtenu à partir d'une Region-based ZoneId n'est pas fixe. Cela dépend de la période spécifique ou dépend de la période de l'année.
Par exemple : ZoneId.of("Asia/Ho_Chi_Minh") est le fuseau horaire du sud du Vietnam. De 1960 à avant le 13 juin 1975, cette ZoneId a utilisé le fuseau horaire +8, puis est passé au fuseau horaire +7 pour s'accorder avec le nord du Vietnam.
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
Vous pouvez également créer une ZoneId avec des règles de fuseau horaire personnalisées par la ZoneRulesProvider :
  • ZoneRulesProvider
  • ZoneRules

13. normalized()

La méthode normalized() renvoie une ZoneId normalisée. En règle générale, il vérifie si le décalage de fuseau horaire de cette ZoneId est fixe ou non. S'il est fixe, ZoneOffset sera retourné, sinon il renvoie cette ZoneId.
public ZoneId normalized()
Par exemple :
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