java - 东部时间 (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");
解决方案
鉴于您的要求是使用“东部区域”,我会使用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
就是“老字号”。当然,理论上,纽约可以在某个时候决定不再成为东部时区的一部分(也许在时间上更接近英国和欧洲),但这似乎不太可能......
推荐阅读
- heroku - 我的机器人突然不再从 heroku 工作了,它不再出现“在线”
- java - 从批处理方法调用时未调用使用 @Retryable 注释的方法
- javascript - 两年之间的每个月循环
- mysql - ORDER BY 优先
- python - 在 Pandas 中将“9999-12-31 00:00:00”转换为“dd/mm/yyyy”
- database - Voyager 不断将数据库还原为我在生产服务器上部署的版本
- java - 如何在 java 中获取 java.lang.reflect.Type 的简单名称
- angular - 如何在 Angular Material 动态表中将数据从一个 ng 容器传递到另一个容器?
- c++ - 试图通过将它包装成 void* 来获得一个 int 并再次将它包装回 Integer 但我没有成功
- excel - Microsoft.Office.Interop.Excel - 在 vb.net 中使用 UTF-8 编码将 .xlsx 转换为 .csv