Java中的TimeZone ID

时间:2009-11-10 13:01:26

标签: java timezone

我遇到了java TimeZone的奇怪问题..

调用 TimeZone.getDefault()会显示我的本地时区,其ID为“GMT + 02:00”。 有趣的是,此ID不会出现在 TimeZone.getAvailableIDs()提供的列表中。显然我的区域似乎是“Etc / GMT + 2”。

我正在尝试使用时区填充组合,但是不可能选择,因为GMT + 02:00不在列表中。 谁见过这个问题?有什么想法吗?


更新

底线是 - 不能依赖ID字符串,必须使用偏移量,因为显示ID可能因系统而异。

6 个答案:

答案 0 :(得分:32)

GMT + 02:00是自定义ID,它不会出现在TimeZone.getAvailableIDs()的输出中(这是巨大的)。您可以做的是要求用户先指定其偏移量,然后获取给定偏移量的可用ID。例如,对于GMT + 02:00,以下代码:

for (String string : TimeZone.getAvailableIDs(TimeZone.getTimeZone(
        "GMT+02:00").getRawOffset())) {
    System.out.println(string);
}

给出以下输出:

ART
Africa/Blantyre
Africa/Bujumbura
Africa/Cairo
Africa/Gaborone
Africa/Harare
Africa/Johannesburg
Africa/Kigali
Africa/Lubumbashi
Africa/Lusaka
Africa/Maputo
Africa/Maseru
Africa/Mbabane
Africa/Tripoli
Asia/Amman
Asia/Beirut
Asia/Damascus
Asia/Gaza
Asia/Istanbul
Asia/Jerusalem
Asia/Nicosia
Asia/Tel_Aviv
CAT
EET
Egypt
Etc/GMT-2
Europe/Athens
Europe/Bucharest
Europe/Chisinau
Europe/Helsinki
Europe/Istanbul
Europe/Kaliningrad
Europe/Kiev
Europe/Mariehamn
Europe/Minsk
Europe/Nicosia
Europe/Riga
Europe/Simferopol
Europe/Sofia
Europe/Tallinn
Europe/Tiraspol
Europe/Uzhgorod
Europe/Vilnius
Europe/Zaporozhye
Israel
Libya
Turkey

它仍然很大但这次人类可以浏览。

答案 1 :(得分:4)

回顾其他一些SO问题,这似乎是一个Java-on-Windows问题。请查看this article,特别是答案1,它指向可能解决您的地图问题的维基百科链接。

答案 2 :(得分:2)

如何使用TimeZone.getAvailableIDs()并将它们按斜杠前的部分分组并进行两步选择?

答案 3 :(得分:2)

Joda时间有一个常数DateTimeZone.UTC。那个阶级或常数可能会对你有所帮助。 http://joda-time.sourceforge.net/apidocs/org/joda/time/DateTimeZone.html

Java 8更新

Java 8现在还有ZoneOffset.UTChttps://docs.oracle.com/javase/8/docs/api/java/time/ZoneOffset.html#UTC

答案 4 :(得分:1)

任何时区都可以指定为“GMT”加/减偏移量。 timezone doc将此称为“自定义ID”。

要填充下拉列表,我认为您最好提出一个特定的城市/抵消列表,并与时区相关联。 getAvailableIDs()返回的数组很大 - 我的安装中有586个条目 - 你肯定不想强迫用户解决这个问题。

答案 5 :(得分:-6)

UTC不是GMT。当人们(包括Java教育工程)开始理解这一点。 GMT有夏令时(是的!)UTC永远不会改变(!)。我认为每个人都应该意识到这一点,就像闰年或闰年的规则一样。