获取Java时区的区域规则时发生异常?
我在获取Java时区的获取Java时区的区域规则时发生异常?,java,java-8,java-time,Java,Java 8,Java Time,我在获取Java时区的ZoneRules时遇到了一个问题。我有一个时区,我正在尝试使用此代码来设置时区: TimeZone tz = getTimeZone(); ZoneRules rules = ZoneRulesProvider.getRules(tz.toZoneId().getId(), true); 当时区是区域性的(例如“亚洲/迪拜”)时,它工作正常。但是当它是一个偏移量,如“GMT-07:00”,它会抛出一个异常: "ZoneRulesException: Unknown ti
ZoneRules
时遇到了一个问题。我有一个时区
,我正在尝试使用此代码来设置时区
:
TimeZone tz = getTimeZone();
ZoneRules rules = ZoneRulesProvider.getRules(tz.toZoneId().getId(), true);
当时区是区域性的(例如“亚洲/迪拜”
)时,它工作正常。但是当它是一个偏移量,如“GMT-07:00”
,它会抛出一个异常:
"ZoneRulesException: Unknown time-zone ID: GMT-07:00".
我打印了ZoneRulesProvider.getAvailableZoneIds()
的所有输出,似乎没有像“GMT-07:00”
这样的区域,但有一个区域“Etc/GMT-7”
有人能解释一下为什么
TimeZone
类的toZoneId
方法返回无效的ZoneId
?将时区
转换为有效的时区ID
的正确方法是什么?您没有在getTimeZone()方法中显示如何创建时区。时区有一个支持的ID列表,可按如下方式检索
for (String zoneId : TimeZone.getAvailableIDs()) {
System.out.println(zoneId);
}
您将看到,它不显示GMT-07:00,只显示“Etc/GMT-7”(以及其他)。您的代码似乎正在运行
TimeZone timeZone = TimeZone.getTimeZone("GMT-07:00");
它创建了一个带有自定义id的时区。其中提到了以下内容:
规则主要由ZoneId使用的区域ID进行查找。只能使用区域ID,此处不使用区域偏移ID
要获取官方时区,请尝试以下代码
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);
谢谢你,根瑟。我从未想过检查可用的时区ID,所以我不知道GMT-07:00是一个自定义ID时区。TimeZone类的文档中也解释了这一点,所以我没有阅读它是我的错。无论如何,你的代码工作得很好。再次感谢。