正确的东部时间(ET)的ZoneId:“美国/东部”还是“美国/纽约”?

nim*_*o23 2 java timezone

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

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

ZoneId TIMEZONE_ET = ZoneId.of("US/Eastern");
Run Code Online (Sandbox Code Playgroud)

要么

ZoneId TIMEZONE_ET = ZoneId.of("America/New_York");
Run Code Online (Sandbox Code Playgroud)

Ole*_*.V. 8

美洲/纽约

\n

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

\n

维基百科关于时区名称的内容

\n

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

\n
\n

时区具有“区域/位置”形式的唯一名称,例如\n“America/New_York”。\xe2\x80\xa6

\n

区域是大陆、海洋或“等等”的名称。目前使用的大陆和海洋包括非洲、美洲、南极洲、北极、\n亚洲、大西洋、澳大利亚、欧洲、印度和太平洋。

\n

位置是 \xe2\x80\x93 区域内特定位置的名称,通常是城市或小岛。

\n

此方案中未使用国家/地区名称,主要是因为由于频繁的政治和边界变化,\n它们不稳固。\n大城市的名称往往更持久。\xe2\x80\xa6

\n
\n

因此,US/Eastern 这个名称来自于按照其他规则创建名称的时代。

\n

关于缩写 ET

\n

因为我在一些评论中感觉到了疑问:北美东部时间可能并且通常缩写为 ET。查看此信息的一种方法是在时区缩写 \xe2\x80\x93 全球列表中。您还可以看到,ET 可能EST(东部标准时间)和 EDT(东部夏令时间)组成,或者用作 EST 的同义词,在西班牙语中也称为 Tiempo del Este。当您研究该列表时,您还会发现很多缩写词都是不明确的。

\n

或者在 Java 中(使用 REPL):

\n
jshell> ZoneId.of("America/New_York").getDisplayName(TextStyle.SHORT, Locale.US) \n$3 ==> "ET"\n
Run Code Online (Sandbox Code Playgroud)\n

只是出于好奇,不推荐,因为存在歧义的风险:您也可以采用其他方式并ZoneId从缩写中获取:

\n
jshell> var dtf = DateTimeFormatter.ofPattern("z", Locale.US);\ndtf ==> ZoneText(SHORT)\n\njshell> ZoneId.from(dtf.parse("ET"))\n$7 ==> America/New_York\n
Run Code Online (Sandbox Code Playgroud)\n

我重复一遍:不要在家里尝试最后一个技巧。

\n


T.J*_*der 5

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

  • 这只是的链接America/New_York
  • 保罗·艾格特(Paul Eggert)的tz回购文件中的该文件说,这些链接是将“旧”名称(例如US / Eastern)链接到当前名称。在这种情况下,“旧”很可能意味着“已弃用”。保罗·艾格特(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
Run Code Online (Sandbox Code Playgroud)

请注意,7月1日中午是夏令时,而1月1日中午则不在夏令时。

更多:

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

to2050.tzs

连结美国/纽约/美国/东部

...这表明这两个是别名(虽然它们ZoneId#equals不会返回true)。另外,northamerica它们具有:

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

并附有相关法律的注释。

因此,对我来说,目前看来,它们是同义词。显然,这US/Eastern是“旧名称”。当然,从理论上讲,纽约可以在某个时候决定不再属于东部时区(也许在时间上更接近英国和欧洲),但这似乎真的不太可能...

  • 很好的答案。最后一点非常重要。如果纽约移到其他时区(例如大西洋时间),则必须更新来自“美国/东部”的链接以指向其他时区(可能是新时区)。还值得指出的是,印第安纳州和肯塔基州*目前*东部时间的一些城市在过去几年中已经偏离了中部时间,并且它们有自己的 TZDB 标识符。还要考虑到 DST 在其中一些(例如 1970 年代的底特律)之间有所不同,并且加拿大的东部时间更好地由“美国/多伦多”代表。 (2认同)