4

我正在尝试获取特定时区的当前时间。我尝试了以下代码。

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 true - 为什么夏令时对亚利桑那州来说是正确的?如何获得凤凰城或美国任何其他城市的正确挂钟时间?

4

4 回答 4

10

亚利桑那州位于山区时区,但不遵守 DST。如果您指定时区“美国/山区”,则计算机将应用山区时区中大多数州使用的规则,包括遵守夏令时。要获得亚利桑那州的规则(不包括 DST),您需要时区“US/Arizona”(或“America/Phoenix”)。在纳瓦霍国家,您需要名为“纳瓦霍”的时区。

为了避免麻烦,请始终尝试使用“America/*”中的名称,您可以在其中选择与您感兴趣的地方具有相同时区规则的城市名称。

要获得世界上任何给定城市的正确时区的正确时间,您只需熟悉奥尔森时区数据库中的名称及其含义即可。虽然您通常认为“时区”一词是指冬季中间的一天中的时间(每个人都遵守标准时间),但在奥尔森数据库中,时区名称代表了夏令时规则和时区规则的整个历史针对特定区域。

例如,尽管印第安纳州现在观察东部时间并观察夏令时(除了芝加哥附近的几个县,它们像芝加哥一样处于中部时间),但在 2006 年之前,他们没有观察夏令时。创建了一个名为“US/Indiana”(或“America/Indianapolis”)的时区来覆盖该地区,即使在今天,您在谈论印第安纳州时仍然希望使用“America/Indianapolis”时区,以便查询日期和 2006 年之前的时间可以正确回答。

于 2010-10-31T23:22:11.797 回答
3

亚利桑那州的大部分地区不遵守夏令时,但亚利桑那州内的纳瓦霍民族确实遵守夏令时。

于 2010-10-31T23:14:35.253 回答
1

可以直接获取全球许多主要城市的区域信息。这包括 Phoenix,其区域标识符为“America/Phoenix”。

您可以使用TimeZone.getAvailableIDs()方法或通过手动检查 JRE lib/zi目录的内容来找到可用区域标识符的列表。

正如其他海报所指出的,“US/Arizona”区域信息与“US/Mountain”不同。

于 2010-10-31T23:32:36.413 回答
1

我正在提供现代答案。不要使用类Calendar,GregorianCalendar和. 它们都设计得很糟糕,幸运的是它们都已经过时了。TimeZoneDate

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 的形式为区域/城市,其中区域可以是像美洲这样的大陆,也可以是像太平洋这样的海洋。

正如其他人所说,夏季时间用于亚利桑那州的一个地方,即纳瓦霍族。提到的Navajo时区 ID 也已弃用。使用美国/丹佛:

    ZonedDateTime navajoNation = ZonedDateTime.now(ZoneId.of("America/Denver"));
    System.out.println(navajoNation);

2019-10-23T05:07:23.037-06:00[美国/丹佛]

由于夏令时仍然有效,与上面凤凰城的时间相比,一天中的时间提前一小时。

链接

于 2019-10-23T11:07:42.093 回答