Java如何获取给定时区缩写的时区ID列表

标签 java timezone simpledateformat java-time

是否可以找到给定时区缩写的时区 ID 列表?例如,对于缩写 IST ,时区 ID 为 Asia/Jerusalem , Asia/KolkataEurope/Dublin .

最佳答案

有趣的问题。由于缩写没有标准化,因此不可能有权威的答案,也没有万无一失的方法来获得这样的答案。我突然想到了两种方法:

  1. 从 JVM 中获取它们。
  2. 在网上找到它们。

从 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]

我的方法的一个限制是,某些时区有多个名称,因此有多个三或四个字母的缩写。我上面的代码只捕获其中之一。

另一个限制是,像我一样选择两个日期永远不会给你过去和 future 的所有可能性,甚至可能会错过一些我没有选择正确日期的地方。我尝试过选择一个北半球冬季南半球夏季的日期,以及相反的日期。这将涵盖目前的大多数情况,但你永远不知道是否有一个或三个时区的过渡不遵循我们所知的夏季和冬季。如果您想要更好的覆盖范围,Hugo’s answer中有一些很好的建议。 .

从互联网获取它们

当然,另一个答案是您的搜索无疑已经提出的答案:此类列表在互联网上是公开的。例如Wikipedia’s List of time zone abbreviationsTime Zone Abbreviations – Worldwide List on timeanddate.com 。正如所料,所提到的两个列表并不相符。例如,后者知道 ADT 的两种解释,而前者只知道一种。后一个列表给出了许多同义词缩写,从而说明了我上面的观点,即每个区域可以有多个缩写。

关于Java如何获取给定时区缩写的时区ID列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44811282/

相关文章:

java - JAX-WS 网络服务 : Beans not injected : NullPointerException

java - 使用beeline或java jdbc代码时,配置单元抛出错误

python - 将日期字符串解析为 UTC UNIX 格式

java - 如果未处理 RuntimeException,我可以将 Eclipse 设置为显示警告吗?

java - 仅限 Spring Boot webapp localhost

ruby-on-rails - 将日期从 angular 传递到 rails

ruby - 在 Ruby 中更改 DateTime 的时区

java - 使用 Date 获取昨天的日期

yyyy 的 Java SimpleDateFormat 格式问题

java - SimpleDateFormat:无法解析的日期 MMMM yyyy