5

我必须传递带有时区信息的消息(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”的名单,...

4

3 回答 3

6

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

于 2019-05-29T17:03:59.007 回答
4

根据文档,如果无法理解给定的 ID ,该getTimeZone方法将返回指定TimeZone的 或区域。GMT没有称为US的 TimeZone ID ,因此它提供了 GMT 区域。如果您真的想获得美国可用的所有时区列表,我建议您使用以下内容。

final List<String> timeZonesInUS = Stream.of(TimeZone.getAvailableIDs())
        .filter(zoneId -> zoneId.startsWith("US")).collect(Collectors.toList());
于 2018-05-24T02:22:14.743 回答
2

如果我理解正确,您似乎只需要来自给定国家/地区的时区列表。该站点列出了所有拥有自己代码的国家/地区:

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

查看 TimeZones 的 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;

}
于 2018-05-23T23:31:16.040 回答