我必须使用时区“ ET”(东部时间)。在Java中,没有ZoneId.of(“ ET”)。
我应该使用哪一个来正确表示“ ET”:
ZoneId TIMEZONE_ET = ZoneId.of("US/Eastern");
或
ZoneId TIMEZONE_ET = ZoneId.of("America/New_York");
答案 0 :(得分:4)
鉴于您的要求是使用“东部区域”,因此我将使用US/Eastern
,但请注意:
America/New_York
的链接。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。一种查看方式是在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
仅仅是为了向后兼容。