Java中的TimeZone ID

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

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

我正在尝试使用时区填充组合,但是不可能选择,因为GMT + 02:00不在列表中..任何人都看到了这个问题? 有任何想法吗?


更新:

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

回顾其他一些SO问题,这似乎是一个Java-on-Windows问题。 请看一下这篇文章 ,特别是答案1,它指向可能解决您的映射问题的维基百科链接。

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); } 

给出以下输出:

艺术
非洲/布兰太尔
非洲/布琼布拉
非洲/开罗
非洲/哈博罗内
非洲/哈拉雷
非洲/约翰内斯堡
非洲/基加利
非洲/卢本巴希
非洲/卢萨卡
非洲/马普托
非洲/马塞卢
非洲/姆巴巴
非洲/的黎波里
亚洲/安曼
亚洲/贝鲁特
亚洲/大马士革
亚洲/加沙
亚洲/伊斯坦布尔
亚洲/耶路撒冷
亚洲/尼科西亚
亚洲/ Tel_Aviv
猫
欧洲东部时间
埃及
其他/ GMT-2
欧洲/雅典
欧洲/布加勒斯特
欧洲/基希讷乌
欧洲/赫尔辛基
欧洲/伊斯坦布尔
欧洲/加里宁格勒
欧洲/基辅
欧洲/玛丽港
欧洲/明斯克
欧洲/尼科西亚
欧洲/里加
欧洲/辛菲罗波尔
欧洲/索非亚
欧洲/塔林
欧洲/蒂拉斯波尔
欧洲/乌日哥罗德
欧洲/维尔纽斯
欧洲/扎波罗热
以色列
利比亚
火鸡

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

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

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

java.time.ZoneId

TimeZone是现在遗留下来的麻烦的旧日期时间类的一部分,由java.time类取代。

在您的情况下,请查看ZoneIdZoneOffset 。 与UTC的偏移量是小时数和分钟数。 时区是区域在不同时间段内使用的过去,现在和将来的偏移的历史。

通过ZoneId.getAvailableZoneIds获取所有已知区域的ZoneId.getAvailableZoneIds 。 确保您的JVM最近已经更新,其中包含您感兴趣的所有时区的信息。 政治家们经常会对频繁更改区域定义产生惊人的倾向,通常几乎没有预警。

 Set < String > ids = ZoneId.getAvailableZoneIds() ; 

自Java 8 Update 144起​​。

[Asia / Aden,America / Cuiaba,Etc / GMT + 9,Etc / GMT + 8,Africa / Nairobi,America / Marigot,Asia / Aqtau,Pacific / Kwajalein,America / El_Salvador,Asia / Pontianak,Africa / Cairo,Pacific / Pago_Pago,非洲/ Mbabane,亚洲/古晋,太平洋/檀香山,太平洋/拉罗汤加,美国/危地马拉,澳大利亚/霍巴特,欧洲/伦敦,美国/伯利兹,美洲/巴拿马,亚洲/重庆,美洲/马那瓜,美国/印第安纳州/彼得堡,亚洲/埃里温,欧洲/布鲁塞尔,格林威治标准时间,欧洲/华沙,美国/芝加哥,亚洲/喀什,智利/大陆,太平洋/雅普,大英/加勒比海地区/格林威治标准时间-1,等等/格林威治标准时间-0,欧洲/泽西岛,America / Tegucigalpa,Etc / GMT-5,Europe / Istanbul,America / Eirunepe,Etc / GMT-4,America / Miquelon,Etc / GMT-3,Europe / Luxembourg,Etc / GMT-2,Etc / GMT-9 ,America / Argentina / Catamarca,Etc / GMT-8,Etc / GMT-7,Etc / GMT-6,Europe / Zaporozhye,Canada / Yukon,Canada / Atlantic,Atlantic / St_Helena,Australia / Tasmania,Libya,Europe / Guernsey ,America / Grand_Turk,美国/太平洋 – 新,亚洲/撒马尔罕,美国/阿根廷/cordova,亚洲/ Phnom_Penh,非洲/基加利,亚洲/阿拉木图, 美国/阿拉斯加州,亚洲/迪拜,欧洲/ Isle_of_Man,美国/ Araguaina,古巴,亚洲/新西伯利亚,美国/阿根廷/萨尔塔,等等/ GMT + 3,非洲/突尼斯,等等/ GMT + 2,等等/ GMT + 1, Pacific / Fakaofo,Africa / Tripoli,Etc / GMT + 0,Israel,Africa / Banjul,Etc / GMT + 7,Indian / Comoro,Etc / GMT + 6,Etc / GMT + 5,Etc / GMT + 4,Pacific / Port_Moresby,美国/亚利桑那州,南极洲/ Syowa,印度/留尼汪岛,太平洋/帕劳,欧洲/加里宁格勒,美洲/蒙得维的亚,非洲/温得和克,亚洲/卡拉奇,非洲/摩加迪沙,澳大利亚/珀斯,巴西/东部,等等/格林威治标准时间,亚洲/赤塔,太平洋/复活节,南极洲/戴维斯,南极洲/麦克默多,亚洲/澳门,美洲/马瑙斯,非洲/弗里敦,欧洲/布加勒斯特,亚洲/托木斯克,美国/阿根廷/门多萨,亚洲/澳门,欧洲/马耳他,墨西哥/ BajaSur,太平洋/塔希提岛,非洲/阿斯梅拉,欧洲/布辛根,美国/阿根廷/ Rio_Gallegos,非洲/马拉博,欧洲/斯科普里,美国/卡塔马卡,美国/ Godthab,欧洲/萨拉热窝,澳大利亚/ ACT,GB-Eire,非洲/拉各斯,美洲/cordova,欧洲/罗马,亚洲/达卡,印度/毛里求斯,太平洋/萨摩亚,美洲/里贾纳,Ame rica / Fort_Wayne,America / Dawson_Creek,非洲/阿尔及尔,欧洲/ Mariehamn,美国/ St_Johns,美国/ St_Thomas,欧洲/苏黎世,美洲/安圭拉,亚洲/帝力,美洲/丹佛,非洲/巴马科,欧洲/萨拉托夫,GB,墨西哥/综合,太平洋/瓦利斯,欧洲/直布罗陀,非洲/科纳克里,非洲/卢本巴希,亚洲/伊斯坦布尔,美国/哈瓦那,新西兰 – CHAT,亚洲/乔巴山,美国/波尔图阿克,亚洲/鄂木斯克,欧洲/瓦杜兹,美国/密歇根州,亚洲/达卡,美国/巴巴多斯,欧洲/ Tiraspol,大西洋/ Cape_Verde,亚洲/叶卡捷琳堡,美国/路易斯维尔,太平洋/约翰斯顿,太平洋/查塔姆,欧洲/卢布尔雅那,美国/圣保罗,亚洲/查亚普拉,美国/库拉索岛,亚洲/杜尚别,美国/圭亚那,美国/瓜亚基尔,美国/马提尼克岛,葡萄牙,欧洲/柏林,欧洲/莫斯科,欧洲/基希讷乌,美国/ Puerto_Rico,America / Rankin_Inlet,太平洋/ Ponape,欧洲/斯德哥尔摩,欧洲/布达佩斯,美洲/阿根廷/胡胡伊,澳大利亚/尤克拉,亚洲/上海,环球,欧洲/萨格勒布,美洲/西class牙港,欧洲/赫尔辛基,亚洲/贝鲁特,亚洲/特拉维夫,太平洋/ Bou gainville,美国/中部,非洲/ Sao_Tome,印度/查戈斯,美洲/卡宴,亚洲/雅库茨克,太平洋/加拉帕戈斯群岛,澳大利亚/北部,欧洲/巴黎,非洲/恩贾梅纳,太平洋/斐济,美洲/ Rainy_River,印度/马尔代夫,澳大利亚/ Yancowinna,SystemV / AST4,Asia / Oral,America / Yellowknife,Pacific / Enderbury,America / Juneau,澳大利亚/维多利亚,美国/印第安纳州/ Vevay,亚洲/塔什干,亚洲/雅加达,非洲/休达,亚洲/ Barnaul, America / Recife,America / Buenos_Aires,America / Noronha,America / Swift_Current,Australia / Adelaide,America / Metlakatla,Africa / Djibouti,America / Paramaribo,Europe / Simferopol,Europe / Sofia,Africa / Nouakchott,Europe / Prague,America / Indiana / Vincennes,Antarctica / Mawson,America / Kralendijk,Antarctica / Troll,Europe / Samara,Indian / Christmas,America / Antigua,Pacific / Gambier,America / Indianapolis,America / Inuvik,America / Iqaluit,Pacific / Funafuti,UTC,南极洲/麦格理,加拿大/太平洋,美洲/蒙克顿,非洲/哈博罗内,太平洋/丘克,亚洲/平壤,美洲/圣文森特,亚洲/加沙,等等 versal,PST8PDT,Atlantic / Faeroe,Asia / Qyzylorda,加拿大/纽芬兰,美国/肯塔基州/路易斯维尔,美洲/雅库特,亚洲/ Ho_Chi_Minh,南极洲/凯西,欧洲/哥本哈根,非洲/阿斯马拉,大西洋/亚速尔群岛,欧洲/维也纳,韩国,太平洋/皮特凯恩,美国/马萨特兰,澳大利亚/昆士兰,太平洋/瑙鲁,欧洲/地拉那,亚洲/加尔各答,SystemV / MST7,澳大利亚/堪培拉,MET,澳大利亚/ Broken_Hill,欧洲/里加,美洲/多米尼加,非洲/ Abidjan,America / Mendoza,America / Santarem,Kwajalein,America / Asuncion,Asia / Ulan_Bator,NZ,America / Boise,Australia / Currie,EST5EDT,Pacific / Guam,Pacific / Wake,Atlantic / Bermuda,America / Costa_Rica,America /道森,亚洲/重庆,爱尔兰,欧洲/阿姆斯特丹,美国/印第安纳州/诺克斯,美国/北达科他州/ Beulah,非洲/阿克拉,大西洋/法罗,墨西哥/ BajaNorte,America / Maceio,Etc / UCT,Pacific / Apia,GMT0, America / Atka,Pacific / Niue,Canada / East-Saskatchewan,Australia / Lord_Howe,Europe / Dublin,Pacific / Truk,MST7MDT,America / Monterrey,America / Nassau,America / Jamaica,Asia / Bi shkek,America / Atikokan,Atlantic / Stanley,Australia / NSW,US / Hawaii,SystemV / CST6,Indian / Mahe,Asia / Aqtobe,America / Sitka,Asia / Vladivostok,Africa / Libreville,Africa / Maputo,Zulu,America /肯塔基州/蒙蒂塞洛,非洲/ El_Aaiun,非洲/瓦加杜古,美国/ Coral_Harbour,太平洋/马克萨斯,巴西/西,美洲/阿鲁巴,美国/北达科他州/中心,美洲/开曼群岛,亚洲/乌兰巴托,亚洲/巴格达,欧洲/ San_Marino, America / Indiana / Tell_City,America / Tijuana,Pacific / Saipan,SystemV / YST9,Africa / Douala,America / Chihuahua,America / Ojinaga,Asia / Hovd,America / Anchorage,Chile / EasterIsland,America / Halifax,Antarctica / Rothera,美国/印第安纳州/印第安纳波利斯,美国/山区,亚洲/大马士革,美国/阿根廷/ San_Luis,美国/圣地亚哥,亚洲/巴库,美国/阿根廷/乌斯怀亚,大西洋/雷克雅未克,非洲/布拉柴维尔,非洲/波多诺伏,美国/ La_Paz,Antarctica / DumontDUrville,Asia / Taipei,Antarctica / South_Pole,Asia / Manila,Asia / Bangkok,Africa / Dar_es_Salaam,Poland,Atlantic / Madeira,Antarctica / Palmer, America / Thunder_Bay,Africa / Addis_Ababa,Asia / Yangon,Europe / Uzhgorod,Brazil / DeNoronha,Asia / Ashkhabad,Etc / Zulu,America / Indiana / Marengo,America / Creston,America / Punta_Arenas,America / Mexico_City,Antarctica / Vostok,亚洲/耶路撒冷,欧洲/安道尔,美国/萨摩亚,中国,亚洲/万象,太平洋/ Kiritimati,美国/马塔莫罗斯,美洲/ Blanc-Sablon,亚洲/利雅得,冰岛,太平洋/波纳佩,亚洲/ Ujung_Pandang,大西洋/南乔治亚,欧洲/里斯本,亚洲/哈尔滨,欧洲/奥斯陆,亚洲/新库兹涅茨克,CST6CDT,大西洋/金丝雀,美国/ Knox_IN,亚洲/科威特,SystemV / HST10,太平洋/埃法特,非洲/洛美,美国/波哥大,美洲/梅诺米尼, America / Adak,Pacific / Norfolk,Europe / Kirov,America / Resolute,Pacific / Tarawa,Africa / Kampala,Asia / Krasnoyarsk,Greenwich,SystemV / EST5,America / Edmonton,Europe / Podgorica,Australia / South,Canada / Central,非洲/布琼布拉,美国/ Santo_Domingo,美国/东部,欧洲/明斯克,太平洋/奥克兰,非洲/卡萨布兰卡,美国/ Glace_Bay,加拿大/东部,亚洲/卡塔尔,欧洲/基辅,新加坡 ,Asia / Magadan,SystemV / PST8,America / Port-au-Prince,Europe / Belfast,America / St_Barthelemy,Asia / Ashgabat,Africa / Luanda,America / Nipigon,Atlantic / Jan_Mayen,Brazil / Acre,Asia / Muscat,Asia /巴林,欧洲/维尔纽斯,美国/福塔莱萨,等等/ GMT0,美国/东印第安纳州,美洲/埃莫西约,美洲/坎昆,非洲/马塞卢,太平洋/科斯雷,非洲/金沙萨,亚洲/加德满都,亚洲/首尔,澳大利亚/ Sydney,America / Lima,Australia / LHI,America / St_Lucia,Europe / Madrid,America / Bahia_Banderas,America / Montserrat,Asia / Brunei,America / Santa_Isabel,Canada / Mountain,America / Cambridge_Bay,Asia / Colombo,Australia / West ,印度/安塔那那利佛,澳大利亚/布里斯class,印第安/马约特岛,美国/印第安纳州 – 斯塔克,亚洲/乌鲁木齐,美国/阿留申,欧洲/伏尔加格勒,美国/ Lower_Princes,美国/温哥华,非洲/布兰太尔,美国/ Rio_Branco,America / Danmarkshavn ,America / Detroit,America / Thule,Africa / Lusaka,Asia / Hong_Kong,Iran,America / Argentina / La_Rioja,Africa / Dakar,SystemV / CST6CDT,America / Tortola,America / Porto_Velho,Asia / Sakha lin,Etc / GMT + 10,America / Scoresbysund,Asia / Kamchatka,Asia / Thimbu,Africa / Harare,Etc / GMT + 12,Etc / GMT + 11,Navajo,America / Nome,Europe / Tallinn,Turkey,Africa /喀土穆,非洲/约翰内斯堡,非洲/class吉,欧洲/贝尔格莱德,牙买加,非洲/比绍,亚洲/德黑兰,WET,欧洲/阿斯特拉罕,非洲/朱巴,美国/ Campo_Grande,美国/贝伦,等/格林威治,亚洲/西贡, America / Ensenada,Pacific / Midway,America / Jujuy,Africa / Timbuktu,America / Bahia,America / Goose_Bay,America / Virgin,America / Pangnirtung,Asia / Katmandu,America / Phoenix,Africa / Niamey,America / Whitehorse,Pacific / Noumea,Asia / Tbilisi,America / Montreal,Asia / Makassar,America / Argentina / San_Juan,Hongkong,UCT,Asia / Nicosia,America / Indiana / Winamac,SystemV / MST7MDT,America / Argentina / ComodRivadavia,America / Boa_Vista,America /格林纳达,亚洲/阿特劳,澳大利亚/达尔文,亚洲/ Khandyga,亚洲/ Kuala_Lumpur,亚洲/法马古斯塔,亚洲/廷布,亚洲/仰光,欧洲/布拉迪斯拉发,亚洲/加尔各答,美国/阿根廷/图库曼,亚洲/喀布尔,印度/日本科科斯, Pacific / Tongatapu,America / New_York,Etc / GMT-12,Etc / GMT-11,Etc / GMT-10,SystemV / YST9YDT,Europe / Ulyanovsk,Etc / GMT-14,Etc / GMT-13,W-SU, America / Merida,EET,America / Rosario,Canada / Saskatchewan,America / St_Kitts,Arctic / Longyearbyen,America / Fort_Nelson,America / Caracas,America / Guadeloupe,Asia / Hebron,Indian / Kerguelen,SystemV / PST8PDT,Africa / Monrovia,亚洲/ Ust-Nera,埃及,亚洲/ Srednekolymsk,美国/北达科他州/ New_Salem,亚洲/ Anadyr,澳大利亚/墨尔本,亚洲/伊尔库茨克,美国/ Shiprock,美国/温尼伯,欧洲/梵蒂冈,亚洲/安曼,等/ UTC, SystemV / AST4ADT,亚洲/东京,美国/多伦多,亚洲/新加坡,澳大利亚/林德曼,美国/洛杉矶,SystemV / EST5EDT,太平洋/马朱罗,美国/阿根廷/布宜诺斯艾利斯,欧洲/尼科西亚,太平洋/瓜达尔卡纳尔岛,欧洲/雅典,美国/太平洋,欧洲/摩纳哥]

获取JVM的当前默认时区 。

 ZoneId z = ZoneId.systemDefault() ; 

美洲/洛杉矶

请注意,JVM的默认值可以在运行期间随时由JVM中任何应用程序的任何线程中的任何代码进行更改。 通常更好地指定期望/预期的时区而不是依赖于系统默认值。

continent/region的格式指定适当的时区名称 ,例如America/MontrealAfrica/CasablancaPacific/Auckland 。 切勿使用3-4字母缩写,例如ESTIST因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

 ZoneId z = ZoneId.of( "America/Montreal" ) ; 

如果您想知道特定区域特定时刻的游戏偏移,请通过ZoneRules对象询问。

 ZoneOffset offsetInEffectNow = z.getRules().getOffset( Instant.now() ); 

请参阅IdeOne.com上的所有上述代码 。

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

不,时区标识符已记录并且一致。 请参阅IANA跟踪的维基百科中的此列表 。

我不太了解TimeZone正在做什么,但如果像其他遗留日期时间类一样,它可能没有明智的设计。 还不确定您的主机操作系统和JVM是如何配置的。 很难诊断,因为你没有提供足够的信息。


关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如java.util.DateCalendarSimpleDateFormat

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。

从哪里获取java.time类?

  • Java SE 8Java SE 9及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6Java SE 7
    • 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
  • Android的
    • ThreeTenABP项目特别适用于Android的ThreeTen-Backport (如上所述)。
    • 请参见如何使用ThreeTenABP ….

ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的课程,如IntervalYearWeekYearQuarter等。

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

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

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