我正在尝试获取特定时区的当前时间。我尝试了以下代码。
Calendar j = new GregorianCalendar(TimeZone.getTimeZone("US/Mountain"));
j.setTimeInMillis(Calendar.getInstance().getTimeInMillis());
System.out.println(j.get(Calendar.HOUR_OF_DAY)+":"+j.get(Calendar.MINUTE));
TimeZone tz = TimeZone.getTimeZone("US/Mountain");
System.out.println("tz.getRawOffset()"+tz.getRawOffset()/3600);
System.out.println(tz.getDSTSavings());
System.out.println
(tz.inDaylightTime(new Date()));
我得到的答案令人惊讶 - 16:57 - 错误1小时 tz.getRawOffset() - 7000 3600000 是的 - 为什么夏令时适用于亚利桑那州? 如何获得凤凰城或美国任何其他城市的正确挂钟时间?
答案 0 :(得分:8)
亚利桑那州是in the Mountain timezone, but doesn't observe DST。如果指定时区“US / Mountain”,则计算机将应用Mountain时区中大多数州使用的规则,其中包括观察夏令时。要获得亚利桑那州(不包括DST)的规则,您需要时区“US / Arizona”(或“America / Phoenix”)。在纳瓦霍国家,您需要名为“Navajo”的时区。
为了省去一些麻烦,请始终尝试使用“America / *”中的名称,您可以在这里选择与您感兴趣的地方具有相同时区规则的城市名称。
要在世界上任何特定城市的正确时区内获得正确的时间,您只需熟悉Olson时区数据库中的名称及其含义即可。虽然您通常认为术语“时区”是指冬季中的时间(当每个人都观察标准时间时),但在Olson数据库中,时区名称表示夏令时规则和时区规则的整个历史记录。对于特定地区。
作为一个例子,尽管Indiana now observes Eastern time and observes DST(除芝加哥附近的几个县,如芝加哥的中央时间),2006年之前他们没有观察到夏令时。创建一个名为“美国/印第安纳”(或“美洲/印第安纳波利斯”)的时区来覆盖这个地区,即使在今天,你仍然想在谈论印第安纳时使用时区“America / Indianapolis”,以便查询日期可以正确回答2006年之前的时间。
答案 1 :(得分:3)
亚利桑那州大部分地区都没有观察夏令时,但亚利桑那州内的纳瓦霍国家确实观察夏令时。
答案 2 :(得分:1)
可以直接为全球许多主要城市获取区域信息。这包括Phoenix,其区域标识符为“America / Phoenix”。
您可以使用 TimeZone.getAvailableIDs()方法或手动检查JRE lib / zi 目录的内容找到可用区域标识符列表。
正如其他海报所述,“美国/亚利桑那州”区域信息与“美国/山区”截然不同。
答案 3 :(得分:0)
我正在提供现代答案。不要使用类Calendar
,GregorianCalendar
,TimeZone
和Date
。它们的设计都不好,幸运的是,它们早已过时。
这很简单,只要您知道如何做:
ZonedDateTime arizonaExceptNavajo = ZonedDateTime.now(ZoneId.of("America/Phoenix"));
System.out.println(arizonaExceptNavajo);
我刚才运行此代码时,输出为:
2019-10-23T04:07:23.034-07:00 [美国/凤凰城]
不建议使用美国/山区时区ID。它是指向America / Denver的链接,而America / Denver确实使用夏令时(夏令时,DST)。现代时区ID的格式为 region / city ,其中 region 是像美国这样的大陆,或者是像太平洋这样的海洋。
正如其他人所说,夏季时间是亚利桑那州纳瓦霍族的一个地方。所提及的Navajo
时区ID也已被弃用。使用美国/丹佛:
ZonedDateTime navajoNation = ZonedDateTime.now(ZoneId.of("America/Denver"));
System.out.println(navajoNation);
2019-10-23T05:07:23.037-06:00 [美国/丹佛]
由于夏季时间仍然有效,所以一天中的时间比上述凤凰城的时间早一小时。