编程语言
首页 > 编程语言> > Java如何获取给定时区缩写的时区ID列表

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

作者:互联网

是否可以找到给定时区缩写的时区ID列表?例如,对于缩写IST,时区ID是亚洲/耶路撒冷,亚洲/加尔各答和欧洲/都柏林.

解决方法:

有趣的问题.由于缩写没有标准化,因此无法获得权威答案,也无法获得这样的答案.在我的脑海中,我想到了两种方法:

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

其中一些只是同一时区的名称.例如,Eire与Europe / Dublin具有相同的规则.因此,如果需要,可以进行进一步的过滤.您可以使用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]

我的方法的一个限制是一些时区被多个名称所知,因此超过一个三或四个字母的缩写.我上面的代码只捕获其中一个.

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

从互联网上获取它们

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

标签:java,timezone,simpledateformat,java-time
来源: https://codeday.me/bug/20191008/1874385.html