为什么Java比卡萨布兰卡实时落后一小时?
在编写Java数据/时间API的一些实验时。我想知道为什么这段代码不能按预期工作:为什么Java比卡萨布兰卡实时落后一小时?,java,time,timezone,Java,Time,Timezone,在编写Java数据/时间API的一些实验时。我想知道为什么这段代码不能按预期工作: ZonedDateTime CasaNow = ZonedDateTime.now(ZoneId.of("Africa/Casablanca")); System.out.println(CasaNow); // 2020-02-20T11:32:28.063419Z[Africa/Casablanca] 我希望它能像我的时钟一样打印“2020-02-20T12:32:28.063419Z[非洲/卡萨布兰卡]”
ZonedDateTime CasaNow = ZonedDateTime.now(ZoneId.of("Africa/Casablanca"));
System.out.println(CasaNow);
// 2020-02-20T11:32:28.063419Z[Africa/Casablanca]
我希望它能像我的时钟一样打印“2020-02-20T12:32:28.063419Z[非洲/卡萨布兰卡]”
这是中的确切时间,但程序会在该时间后生成一小时。我做错了什么
更新
JDK信息:
java 11.0.1 2018-10-16 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.1+13-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.1+13-LTS, mixed mode)
操作系统的区域设置配置:
据我所知,自2018年以来,摩洛哥在斋月期间的UTC+01:00,除了偏移量+00:00(通常写为
Z
)。所以你是对的:今天获得UTC(Z
)的时间是出乎意料的,因为斋月要到4月底才开始
据英国广播公司报道,摩洛哥于2018年10月(截至撰写之日为1年4个月前)决定保持其前一个夏季时间(DST),也在冬季。所以我猜Stephen C的评论是正确的,Java安装中的时区数据库早于2018年10月。因此,Java现在假定为标准时间,并且错误地以UTC表示时间
值得一提的是,我刚刚在Java 8上获得了2020-02-20T19:08:47.375Z[非洲/卡萨布兰卡]
,在Java 11上获得了2020-02-20T20:06:43.174686+01:00[非洲/卡萨布兰卡]
。因此,我的Java 8似乎是2018年10月之前的版本,而我的Java 11是更新的。据我记忆所及,在我安装它们之后,它们的时区数据库都没有更新过
时区更新工具
因为您使用的是Oracle Java,所以解决方案是使用时区更新工具更新Java的时区数据库。请参阅底部的链接,并按照此处给出的说明进行操作。不过,关于该工具的失败,有几个堆栈溢出问题,所以我希望您能够解决。最后的办法是安装一个全新的Java运行时环境
链接
- 英国广播公司2018年10月28日
- 在timeanddate.com上
- 在oracle.com上
2020-02-20T12:41:32.546503+01:00[非洲/卡萨布兰卡]
,这与您所期望的更接近。您的Java时区数据库是最新的吗?顺便说一句,我已经使用多个JRE运行了这个代码段。所有这些都会产生相同的结果。您不应该期望它打印2020-02-20T12:32:28.063419Z-Z表示“UTC偏移量为0”,这只在20分钟内正确。UTC前1小时时区的正确输出为2020-02-20T12:41:32.546503+01:00[Africa/Casablanca]在JDK 13.0.1上使用JShell运行代码时,我得到2020-02-20T13:14:30+01:00[Africa/Casablanca]
。