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
  • 在维基百科上

印第安纳州的情况比上述情况更加复杂。一些县使用东部时间和DST;有些使用中央时间和DST;大多数使用东部时间,但不观察DST。奥尔森数据库中印第安纳州的时区名称列表包括:美国/韦恩堡、美国/印第安纳州/印第安纳波利斯、美国/印第安纳州/诺克斯、美国/印第安纳州/马伦戈、美国/印第安纳州/彼得堡、美国/印第安纳州/泰尔尤市、美国/印第安纳州/维维韦、美国/印第安纳州/文森斯、美国/印第安纳州/维纳马克、美国/印第安纳波利斯、美国/诺克斯尤、,美国/东印第安纳州,美国/印第安纳州斯塔克。@乔纳森:你说得对。在东部时区,有些县一直采用夏令时。然后,当印第安纳州决定采用夏令时作为一个整体时,两个时区边界上的许多不同的县在不同的时间在两个时区之间来回切换,所以确实存在。但就理解奥尔森如何设计他的数据库而言,我对印第安纳州的简单解释就足够了。