东部时间 (ET) 的正确 ZoneId:“美国/东部”或“美国/New_York”?
我必须使用时区“ET”(东部时间)。在Java中,没有ZoneId.of(“ET”)。
我应该使用哪一个来正确表示“ET”:
ZoneId TIMEZONE_ET = ZoneId.of("US/Eastern");
或
ZoneId TIMEZONE_ET = ZoneId.of("America/New_York");
我必须使用时区“ET”(东部时间)。在Java中,没有ZoneId.of(“ET”)。
我应该使用哪一个来正确表示“ET”:
ZoneId TIMEZONE_ET = ZoneId.of("US/Eastern");
或
ZoneId TIMEZONE_ET = ZoneId.of("America/New_York");
鉴于您的要求是使用“东部区域”,我将使用 ,但请注意:US/Eastern
America/New_York
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#equals
true
northamerica
# US eastern time, represented by New York
并附上引用相关法律的注释。
所以在我看来很清楚,目前,它们是同义词。同样清楚的是,这是“旧名称”。当然,从理论上讲,纽约可能会在某个时候决定不再成为东部时区的一部分(也许在时间上更接近英国和欧洲),但这似乎真的不太可能......US/Eastern
答案在 tz 数据库时区列表中:美国/东部已弃用,只是指向美国/New_York的链接。因此,为了确保将来的兼容性,您应该使用美国/New_York。
维基百科文章tz数据库说(摘录):
时区具有“区域/位置”形式的唯一名称,例如“美国/New_York”。...
面积是大陆,海洋或“等”的名称。目前使用的大陆和海洋是非洲,美洲,南极洲,北极,亚洲,大西洋,澳大利亚,欧洲,印度和太平洋。
位置是区域内特定位置的名称 - 通常是城市或小岛。
这一方案没有使用国名,主要是因为由于政治和边界的频繁变化,国名不够有力。大城市的名字往往更永久。...
因此,美国/东方这个名字来自按照其他规则创建名称的时代。
由于我在一些评论中感受到了一个疑问:北美东部时间可能是并且通常缩写为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
我再说一遍:不要在家里尝试这最后一招。