例如,我有一个 java TimeZone 对象America/Denver
。理论上,IANA 数据库列出了该时区的一个国家代码,即US
.
在 java 或 Android 中,如何获取指定 TimeZone 对象的国家/地区?
更新:请注意,我不是在谈论映射GMT+0700
到特定国家/地区。显然,可能有多个国家映射到一个原始偏移量。我正在谈论将特定时区代码从https://en.wikipedia.org/wiki/Zone.tab映射到其关联的单数国家代码。
例如,我有一个 java TimeZone 对象America/Denver
。理论上,IANA 数据库列出了该时区的一个国家代码,即US
.
在 java 或 Android 中,如何获取指定 TimeZone 对象的国家/地区?
更新:请注意,我不是在谈论映射GMT+0700
到特定国家/地区。显然,可能有多个国家映射到一个原始偏移量。我正在谈论将特定时区代码从https://en.wikipedia.org/wiki/Zone.tab映射到其关联的单数国家代码。
为了在国家和时区之间进行映射,我使用了 ICU库。使用 com.ibm.icu.util.TimeZone.getAvailableIDs(countryCode) 方法,我设法将时区映射到国家代码。
public static Map<String, String> mapTimezonesToCountries() {
Map<String, String> timezoneToCountry = new HashMap<>();
String[] locales = Locale.getISOCountries();
for (String countryCode : locales) {
for (String id : com.ibm.icu.util.TimeZone.getAvailableIDs(countryCode))
{
// Add timezone to result map
timezoneToCountry.put(id, countryCode);
}
}
return timezoneToCountry;
}
你不能,从 TimeZone 到 Country 没有 1:1 的关系。
例如,还有时区“UTC”
您提供给 zone.tab 的链接实际上是您要查找的数据的来源。当然,您希望使用权威的,而不是维基百科上的副本。
IANA/Olson 数据库是用 Java 和JodaTime库实现的。但我不相信他们通过任何类公开 zone.tab 。至少我找不到。如果我在这方面不正确,请更新我。
您始终可以自己导入文件并根据需要使用它。
更新
我对 Android 一无所知,但我发现了一些对你来说可能有意义的东西。似乎有一个函数在libcore.icu.TimeZoneNames.forLocale(locale)中公开 zone.tab 数据
我进行了搜索,但找不到任何关于此的参考文档。