Java 亚利桑那州时区日间节光
我正在尝试获取特定时区的当前时间。我尝试了以下代码Java 亚利桑那州时区日间节光,java,timezone,dst,Java,Timezone,Dst,我正在尝试获取特定时区的当前时间。我尝试了以下代码 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 =
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
正确-为什么夏令时适用于亚利桑那州?
如何获得凤凰城或美国任何其他城市的正确挂钟时间?亚利桑那州大部分地区不遵守夏令时,但亚利桑那州境内的纳瓦霍族确实遵守DST。亚利桑那州是。如果您指定时区“美国/山区”,则计算机将应用山区时区中大多数州使用的规则,包括遵守夏令时。要获取亚利桑那州的规则(不包括DST),您需要时区“US/Arizona”(或“America/Phoenix”)。在纳瓦霍族,你想要一个名为“纳瓦霍”的时区 为了省去一些麻烦,请始终尝试使用“America/*”中的名称,在这里您可以选择与您感兴趣的地方具有相同时区规则的城市名称 要在世界上任何给定城市的正确时区中获得正确的时间,您只需熟悉奥尔森时区数据库中的名称及其含义。虽然你通常认为“时区”这个词是指在冬季中的一天中的时间(当每个人都遵守标准时间)时,在奥尔森数据库中,时区名称代表特定区域的夏令时规则和时区规则的整个历史。
例如,尽管(除了芝加哥附近的几个县,像芝加哥一样在中央时间),但在2006年之前,他们并没有遵守DST。创建了一个名为“美国/印第安纳”(或“美国/印第安纳波利斯”)的时区以覆盖该地区,即使在今天,当谈论印第安纳州时,您仍然希望使用时区“美国/印第安纳波利斯”,这样就可以正确回答有关2006年之前日期和时间的查询。可以直接获得全球许多主要城市的分区信息。这包括区域标识符为“America/Phoenix”的Phoenix 您可以使用TimeZone.getAvailableIDs()方法或手动检查JRE lib/zi目录的内容来查找可用区域标识符的列表
正如其他海报所指出的,“美国/亚利桑那州”区域信息不同于“美国/山区”。我提供了现代答案。不要使用类
日历
、格雷戈里安日历
、时区
和日期
。它们都设计得很糟糕,幸运的是它们都早已过时
java.time
当您知道如何操作时,这很简单:
ZonedDateTime arizonaExceptNavajo = ZonedDateTime.now(ZoneId.of("America/Phoenix"));
System.out.println(arizonaExceptNavajo);
刚才我运行这段代码时,输出是:
2019-10-23T04:07:23.034-07:00[美国/凤凰城]
不推荐使用美国/山区时区ID。它是美国/丹佛的链接,美国/丹佛确实使用夏季时间(夏令时,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[美国/丹佛]
由于夏季时间仍然有效,一天中的时间比上面凤凰城的时间提前一个小时
链接
- 解释如何使用java.time
- 在维基百科上