有趣的问题。由于缩写没有标准化,因此不可能有权威的答案,也没有万无一失的方法来获得这样的答案。我突然想到了两种方法:
- 从 JVM 获取它们。
- 在网上找到它们。
从 JVM 获取区域:
String givenAbbr = "IST";
LocalDateTime summerSouthernHemisphere = LocalDate.of(2018, Month.JANUARY, 31).atStartOfDay();
LocalDateTime summerNorthernHemisphere = LocalDate.of(2018, Month.JULY, 31).atStartOfDay();
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("z");
Set<ZoneId> zones = new HashSet<>();
for (String id : ZoneId.getAvailableZoneIds()) {
ZoneId zone = ZoneId.of(id);
String abbr = summerSouthernHemisphere.atZone(zone).format(dtf);
if (abbr.equals(givenAbbr)) {
zones.add(zone);
}
abbr = summerNorthernHemisphere.atZone(zone).format(dtf);
if (abbr.equals(givenAbbr)) {
zones.add(zone);
}
}
System.out.println(zones);
这打印:
[Asia/Calcutta, Eire, Europe/Dublin, Asia/Jerusalem, Asia/Tel_Aviv, Israel, Asia/Kolkata, Asia/Colombo]
不过,其中一些只是同一时区的名称。例如,爱尔兰的规则与欧洲/都柏林相同。因此,如果需要,可以进行进一步的过滤。您可以使用oneZoneId.getRules().equals(anotherZoneId.getRules())
确定是否有两个ZoneId
对象具有相同的区域规则。
对于缩写 CST,该列表更长并且具有更多同义词:
[PRC, America/Matamoros, Asia/Taipei, America/Regina, America/El_Salvador,
America/North_Dakota/New_Salem, Asia/Harbin, America/Costa_Rica,
America/North_Dakota/Center, America/Guatemala, America/Winnipeg,
Asia/Chongqing, America/Rankin_Inlet, America/Indiana/Knox,
America/Belize, SystemV/CST6CDT, Mexico/General,
America/North_Dakota/Beulah, CST6CDT, America/Swift_Current,
America/Knox_IN, Asia/Chungking, Asia/Macao, Asia/Shanghai,
America/Indiana/Tell_City, America/Menominee, America/Bahia_Banderas,
America/Managua, Canada/East-Saskatchewan, Asia/Macau, America/Havana,
America/Resolute, US/Central, US/Indiana-Starke, Cuba, America/Monterrey,
America/Chicago, America/Merida, America/Mexico_City, Canada/Central,
America/Tegucigalpa, America/Rainy_River, Canada/Saskatchewan, SystemV/CST6]
我的方法的一个局限性是,某些时区有多个名称,因此有多个三或四个字母的缩写。我上面的代码只捕获其中之一。
另一个限制是,像我一样选择两个日期永远不会给你过去和未来的所有可能性,甚至可能会错过一些我没有选择正确日期的地方。我尝试过选择一个北半球冬季南半球夏季的日期,以及相反的日期。这将涵盖目前的大多数情况,但你永远不知道是否有一个或三个时区的过渡不遵循我们所知的夏季和冬季。如果您想要更好的覆盖范围,这里有一些很好的建议雨果的回答.
从互联网上获取它们
当然,另一个答案是您的搜索无疑已经提出的答案:此类列表在互联网上是公开的。例如维基百科的时区缩写列表 and 时区缩写 – timeanddate.com 上的全球列表。正如所料,所提到的两个列表并不相符。例如,后者知道 ADT 的两种解释,而前者只知道一种。后一个列表给出了许多同义词缩写,从而说明了我上面的观点,即每个区域可以有多个缩写。