东部时间 (ET) 的正确 ZoneId:“美国/东部”或“美国/New_York”?

2022-09-04 01:28:38

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

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

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

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

答案 1

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

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

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

任何一个都将包含 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:

Link America/New_York    US/Eastern

...这表明这两者是别名(altough不会为它们返回)。此外,在他们有:ZoneId#equalstruenorthamerica

# US eastern time, represented by New York

并附上引用相关法律的注释。

所以在我看来很清楚,目前,它们是同义词。同样清楚的是,这是“旧名称”。当然,从理论上讲,纽约可能会在某个时候决定不再成为东部时区的一部分(也许在时间上更接近英国和欧洲),但这似乎真的不太可能......US/Eastern


答案 2

美洲/New_York

答案在 tz 数据库时区列表中:美国/东部已弃用,只是指向美国/New_York的链接。因此,为了确保将来的兼容性,您应该使用美国/New_York。

关于时区名称的维基百科

维基百科文章tz数据库说(摘录):

时区具有“区域/位置”形式的唯一名称,例如“美国/New_York”。...

面积是大陆,海洋或“等”的名称。目前使用的大陆和海洋是非洲,美洲,南极洲,北极,亚洲,大西洋,澳大利亚,欧洲,印度和太平洋。

位置是区域内特定位置的名称 - 通常是城市或小岛。

这一方案没有使用国名,主要是因为由于政治和边界的频繁变化,国名不够有力。大城市的名字往往更永久。...

因此,美国/东方这个名字来自按照其他规则创建名称的时代。

关于缩写ET

由于我在一些评论中感受到了一个疑问:北美东部时间可能是并且通常缩写为ET。查看此内容的一种方法是在时区缩写 - 全球列表中。您还可以看到ET可以同时包含EST(东部标准时间)和EDT(东部夏令时),或者用作EST的同义词,在西班牙语中也称为Tiempo del Este。当你研究这个列表时,你也会发现很多缩写都是模棱两可的。

或者在Java中(使用REPL):

jshell> ZoneId.of("America/New_York").getDisplayName(TextStyle.SHORT, Locale.US) 
$3 ==> "ET"

只是出于好奇,不建议这样做,因为存在歧义的风险:您也可以走另一条路,从缩写中获取:ZoneId

jshell> var dtf = DateTimeFormatter.ofPattern("z", Locale.US);
dtf ==> ZoneText(SHORT)

jshell> ZoneId.from(dtf.parse("ET"))
$7 ==> America/New_York

我再说一遍:不要在家里尝试这最后一招。


推荐