2016-08-21 6 views
1

J'ai eu un problème en obtenant le ZoneRules pour un fuseau horaire en Java. J'ai un TimeZone et je suis en train de l'ZoneRules en utilisant ce code:Exception lors de l'obtention des règles de zone d'un fuseau horaire Java?

TimeZone tz = getTimeZone(); 
ZoneRules rules = ZoneRulesProvider.getRules(tz.toZoneId().getId(), true); 

Lorsque le fuseau horaire est régional (comme "Asia/Dubai" par exemple), il fonctionne correctement. Mais quand il est un décalage comme "GMT-07:00", il lance une exception:

"ZoneRulesException: Unknown time-zone ID: GMT-07:00". 

J'ai imprimé toute la sortie de ZoneRulesProvider.getAvailableZoneIds() et il semble qu'il n'y ait pas de zone comme "GMT-07:00" mais il y a une zone "Etc/GMT-7".

Quelqu'un pourrait-il s'il vous plaît expliquer pourquoi la méthode toZoneId de la classe retourne TimeZone un ZoneId invalide? Quelle est la bonne façon de convertir un TimeZone en un ZoneId valide.

Répondre

2

Vous ne montrez pas comment vous créez le TimeZone dans la méthode getTimeZone(). TimeZone a une liste d'identifiants pris en charge qui peut être récupéré comme suit

for (String zoneId : TimeZone.getAvailableIDs()) { 
     System.out.println(zoneId); 
    } 

Vous verrez, qu'il ne montre pas GMT-07: 00, mais seulement "Etc/GMT-7" (entre autres). Il semble que votre code fait

TimeZone timeZone = TimeZone.getTimeZone("GMT-07:00"); 

qui crée un TimeZone avec un ID personnalisé. https://docs.oracle.com/javase/8/docs/api/java/time/zone/ZoneRulesProvider.html mentionne ce qui suit:

Les règles sont cherchés principalement par ID de zone, tel qu'il est utilisé par IDZone. Seuls les ID de zones de zones peuvent être utilisés, les ID de décalage de zone ne sont pas utilisés ici.

Pour obtenir le timeZone officiel, essayez le code suivant

TimeZone customTimeZone = TimeZone.getTimeZone("GMT-07:00"); 
    TimeZone officialTimeZone = null; 
    for (String timeZoneId : TimeZone.getAvailableIDs()) { 
     if (TimeZone.getTimeZone(timeZoneId).hasSameRules(customTimeZone)){ 
      officialTimeZone = TimeZone.getTimeZone(timeZoneId); 
      break; 
     } 
    } 
    ZoneRules zoneRules = ZoneRulesProvider.getRules(officialTimeZone.toZoneId().getId(), true); 
    System.out.println(zoneRules); 

Ou bien

TimeZone officialTimeZone = TimeZone.getTimeZone(TimeZone.getAvailableIDs(TimeZone.getTimeZone("GMT-07:00").getRawOffset())[0]); 
    ZoneRules zoneRules =ZoneRulesProvider.getRules(officialTimeZone.toZoneId().getId(), true); 
    System.out.println(zoneRules); 
+0

Merci Guenther. Je n'ai jamais pensé à vérifier les ID de fuseau horaire disponibles, donc je ne savais pas que GMT -07: 00 était un fuseau horaire personnalisé. Ceci est également expliqué dans la documentation de la classe TimeZone donc c'est de ma faute si je ne l'ai pas lu. De toute façon, votre code fonctionne très bien. Merci encore. –