获取 Java 时区的区域规则时出现异常?

Exception when getting the Zone Rules of a Java TimeZone?

我在获取 Java 时区的 ZoneRules 时遇到了问题。我有一个 TimeZone,我正在尝试使用此代码 ZoneRules

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".

谁能解释一下为什么 TimeZone class returns 的 toZoneId 方法无效 ZoneId?将 TimeZone 转换为有效 ZoneId.

的正确方法是什么

您没有说明如何在 getTimeZone() 方法中创建时区。 TimeZone 有一个支持的 id 列表,可以按如下方式检索

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

您会看到,它不显示 GMT-07:00,而只显示 "Etc/GMT-7"(以及其他)。看来你的代码在做

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

创建一个带有自定义 ID 的时区。 https://docs.oracle.com/javase/8/docs/api/java/time/zone/ZoneRulesProvider.html 提及以下内容:

Rules are looked up primarily by zone ID, as used by ZoneId. Only zone region IDs may be used, zone offset IDs are not used here.

要获取官方时区,请尝试以下代码

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