获取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

我在获取Java时区的
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类的文档中也解释了这一点,所以我没有阅读它是我的错。无论如何,你的代码工作得很好。再次感谢。