2016-08-21 1 views
1

У меня возникла проблема получения ZoneRules для часового пояса на Java. У меня есть TimeZone, и я пытаюсь к ZoneRules с помощью этого кода:Исключение при получении правил зоны Java TimeZone?

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

Когда временная зона является региональным (как "Asia/Dubai", например), он работает правильно. Но когда это смещение как "GMT-07:00", он бросает исключение:

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

Я напечатал всю продукцию ZoneRulesProvider.getAvailableZoneIds() и, кажется, там нет зоны, как "GMT-07:00" но есть зона "Etc/GMT-7".

Может ли кто-нибудь объяснить, почему метод toZoneId класса TimeZone возвращает недопустимый ZoneId? Каков правильный способ преобразования TimeZone в действительный ZoneId.

ответ

2

Вы не показываете, как вы создаете TimeZone в методе getTimeZone(). TimeZone имеет список поддерживаемых идентификаторов, которые могут быть извлеченного следующим

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

Вы увидите, что он не показывает GMT-07: 00, но только «Etc/GMT-7» (среди других). Кажется, что ваш код делает

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

который создает TimeZone с пользовательским идентификатором. https://docs.oracle.com/javase/8/docs/api/java/time/zone/ZoneRulesProvider.html упоминает следующее:

Правила проверяются главным образом идентификатором зоны, используемым ZoneId. Могут использоваться только идентификаторы зоны зоны, здесь не используются идентификаторы смещения зоны.

Чтобы получить официальный TimeZone, попробуйте следующий код

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); 

Или же

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

Спасибо вам Гюнтер. Я никогда не думал проверять доступные идентификаторы часовых поясов, поэтому я не знал, что GMT-07: 00 - это пользовательский часовой пояс. Это также объясняется в документации для класса TimeZone, поэтому я виноват, что не прочитал его. В любом случае, ваш код отлично работает. Еще раз спасибо. –