在Java中通过国家代码获取地区时区

5

我需要传递带有时区信息(如 America/Los_Angeles)的消息(jms),但我只有国家名称和代码。如果可能,用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”时区的列表...


一个国家的所有时区? - Louis Wasserman
是的,如果可能的话,请提供一个列表。 - Manvi
1
它并没有内置于Java中。你可能能够在某个数据库中找到这些信息。 - Ole V.V.
3个回答

7

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


4
根据文档,getTimeZone方法返回指定的TimeZone,或者如果给定的ID无法理解,则返回GMT区。由于没有名为US的TimeZone ID,因此它会返回GMT区。如果您真的想获得在美国可用的所有TimeZones的列表,我建议您使用以下方法。
final List<String> timeZonesInUS = Stream.of(TimeZone.getAvailableIDs())
        .filter(zoneId -> zoneId.startsWith("US")).collect(Collectors.toList());

5
这将为您提供弃用的时区,例如US/ Alaska,而不是当前的时区,比如America/ Adak 或 America/Los_Angeles。我不是说这不够好,只是要三思而后行。它也无法适用于其他国家代码。 - Ole V.V.
除了美国,您是否尝试过在其他国家使用这种方法?美国只是一个简单的例子,但是对于“AU”或其他返回空列表的国家,有什么解决方案吗? - user15807010
很遗憾,我没有。 - Ravindra Ranwala
有什么解决方案吗?我很感谢你的建议。 - user15807010
我会检查它并让你知道。 - Ravindra Ranwala
显示剩余2条评论

2
如果我理解正确的话,看起来你只是想要一个给定国家的时区列表。这个网站列出了所有有自己代码的国家的列表:

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;

}

3
时区不包含国家名称,它们包含的是所在大陆和城市的名称。 - Halil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接