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

时间:2019-06-25 16:51:54

标签: java timezone

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

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

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

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

3 个答案:

答案 0 :(得分:4)

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

  • 这只是指向America/New_York的链接。
  • 保罗·艾格特(Paul Eggert)的tz回购中的
  • This file说,这些链接是将“旧”名称(例如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

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

更多:

IANA Time Zone Database files中,我发现:

to2050.tzs

Link America/New_York    US/Eastern

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

# US eastern time, represented by New York

并附有相关法律的注释。

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

答案 1 :(得分:3)

美国/纽约

答案在List of tz database time zones中:不推荐使用US / Eastern,它只是指向America / New_York的链接。因此,为了确保将来的兼容性,您应该使用America / New_York。

关于缩写ET

由于我在几条评论中感到了疑问:北美东部时间可能是并且通常简称为ET。一种查看方式是在Time Zone Abbreviations – Worldwide List中。您还可以看到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

我再说一遍:不要在家中尝试最后一个技巧。

答案 2 :(得分:1)

如果您这样做:

System.out.println(TimeZone.getTimeZone(("US/Eastern")));
System.out.println(TimeZone.getTimeZone(("America/New_York")));

输出为:

sun.util.calendar.ZoneInfo[id="US/Eastern",offset=-18000000,dstSavings=3600000,useDaylight=true,transitions=235,lastRule=java.util.SimpleTimeZone[id=US/Eastern,offset=-18000000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=2,startDay=8,startDayOfWeek=1,startTime=7200000,startTimeMode=0,endMode=3,endMonth=10,endDay=1,endDayOfWeek=1,endTime=7200000,endTimeMode=0]]


sun.util.calendar.ZoneInfo[id="America/New_York",offset=-18000000,dstSavings=3600000,useDaylight=true,transitions=235,lastRule=java.util.SimpleTimeZone[id=America/New_York,offset=-18000000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=2,startDay=8,startDayOfWeek=1,startTime=7200000,startTimeMode=0,endMode=3,endMonth=10,endDay=1,endDayOfWeek=1,endTime=7200000,endTimeMode=0]]

显示的每个设置的值完全相同。两者没有区别。

但是,要感谢Andreas的评论,不推荐使用America/New_York而不是US/Eastern,因为here和官方列表here都已弃用。

根据数据库作者在github上的官方列表,存在US/Eastern仅仅是为了向后兼容。