获取 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);
我在获取 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);