首页 > 解决方案 > 东部时间 (ET) 的正确 ZoneId:“US/Eastern”还是“America/New_York”?

问题描述

我必须使用时区“ET”(东部时间)。在 Java 中,没有 ZoneId.of("ET")。

我应该使用哪一个来正确表示“ET”:

ZoneId TIMEZONE_ET = ZoneId.of("US/Eastern");

或者

ZoneId TIMEZONE_ET = ZoneId.of("America/New_York");

标签: javatimezone

解决方案


鉴于您的要求是使用“东部区域”,我会使用US/Eastern,但请注意:

  • 这只是一个链接America/New_York
  • Paul Eggert 的 repo 中的这个文件tz说,这些链接是将“旧”名称(例如美国/东部)链接到当前名称。在这种情况下,“旧”可能意味着“已弃用”。Paul Eggert 是 IANA 时区列表的 TZ 协调员,因此这是一个明显的规范来源。

鉴于此,您可能最好使用America/New_York,但鉴于更改被列为从 1993 年开始,显然旧名称不会很快消失。

任何一个都将包含 DST 规则等。在我的系统上,例如:

var zoneRules = ZoneId.of("US/Eastern").getRules();
System.out.println(zoneRules.isDaylightSavings(Instant.parse("2019-07-01T12:00:00Z"))); // true
System.out.println(zoneRules.isDaylightSavings(Instant.parse("2019-01-01T12:00:00Z"))); // false

请注意,7 月 1 日中午是 DST,而 1 月 1 日中午不是。

更多的:

IANA 时区数据库文件中,我发现:

to2050.tzs

链接美国/纽约美国/东部

...这表明这两个是别名(尽管ZoneId#equals不会true为它们返回)。此外,northamerica他们有:

# 美国东部时间,以纽约为代表

附有引用相关法律的注释。

所以我现在很清楚,它们是同义词。也很明显,US/Eastern就是“老字号”。当然,理论上,纽约可以在某个时候决定不再成为东部时区的一部分(也许在时间上更接近英国和欧洲),但这似乎不太可能......


推荐阅读