为什么Java比卡萨布兰卡实时落后一小时?

为什么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[非洲/卡萨布兰卡]”

在编写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[非洲/卡萨布兰卡]”

这是中的确切时间,但程序会在该时间后生成一小时。我做错了什么

更新 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]