我遇到了java TimeZone的奇怪问题..
调用 TimeZone.getDefault()会显示我的本地时区,其ID为“GMT + 02:00”。 有趣的是,此ID不会出现在 TimeZone.getAvailableIDs()提供的列表中。显然我的区域似乎是“Etc / GMT + 2”。
我正在尝试使用时区填充组合,但是不可能选择,因为GMT + 02:00不在列表中。 谁见过这个问题?有什么想法吗?
更新
底线是 - 不能依赖ID字符串,必须使用偏移量,因为显示ID可能因系统而异。
答案 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.UTC
:https://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永远不会改变(!)。我认为每个人都应该意识到这一点,就像闰年或闰年的规则一样。