获取 Java 国家代码所在地区的时区

Get timezone of area with country code in Java

我必须传递带有时区信息的消息 (jms),例如 (America/Los_Angeles),但我只有国家名称和代码。如果可能的话,使用 Java 代码获取时区信息。我在某处读到这个:

System.out.println(TimeZone.getTimeZone("US"));

但它给出的输出为

sun.util.calendar.ZoneInfo[id="GMT",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null]

我期待 "America/Los_Angeles" 的列表,...

如果我没理解错的话,您似乎只想要一个给定国家/地区的时区列表。该站点列出了所有拥有自己的代码的国家/地区:

https://garygregory.wordpress.com/2013/06/18/what-are-the-java-timezone-ids/

查看 API 的时区表明无法直接通过 TimeZone.getTimeZone() 获取时区列表。因此,您可能想要遍历它们,看看哪些以国家/地区名称开头并将它们添加到列表中,如下所示:

public static List<String> GetZones(String country) {
    List<String> zones = new ArrayList<>();

    for (String i : TimeZone.getAvailableIDs()) {
        if (i.startsWith(country)) {
            zones.add(i);
        }
    }
    return zones;

}

根据文档,getTimeZone 方法 returns 指定的 TimeZoneGMT 区域(如果无法理解给定的 ID)。没有名为 US 的时区 ID,因此它给出了 GMT 时区。如果你真的想获得美国可用的所有时区列表,我建议你使用以下内容。

final List<String> timeZonesInUS = Stream.of(TimeZone.getAvailableIDs())
        .filter(zoneId -> zoneId.startsWith("US")).collect(Collectors.toList());

内置 Java 类 不提供此功能,但 ICU's TimeZone class 提供,并且 TimeZone.getAvailableIDs("US") 提供正确答案。