java - 为什么 Java 产生的时间比卡萨布兰卡实时时间晚一小时?

标签 java time timezone

在 Java Data/Time 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[非洲/卡萨布兰卡]”。

这是Casablanca中的确切时间但节目播出时间晚了一个小时。我做错了什么?

更新

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)

操作系统的区域设置配置:

locale configuration of the operating system

最佳答案

据我了解,自 2018 年以来,摩洛哥使用 UTC+01:00,但斋月期间的偏移量为 +00:00(通常写为 Z)。所以您是对的:今天获得 UTC (Z) 时间是意外的,因为斋月要到公历四月下旬才开始。

据 BBC 摩洛哥报道,2018 年 10 月(截至撰写本文时 1 年前 4 个月)决定在冬季也保留之前的夏令时 (DST)。所以我的猜测是,Stephen C 在评论中是正确的,您的 Java 安装中的时区数据库早于 2018 年 10 月。因此,Java 现在假定标准时间,并错误地为您提供 UTC 时间。

无论如何,我刚刚获得了 Java 8 上的 2020-02-20T19:08:47.375Z[Africa/Cas​​ablanca]2020-02-20T20:06:43.174686 +01:00[Africa/Cas​​ablanca] 关于 Java 11。看来我的 Java 8 是 2018 年 10 月之前的版本,而我的 Java 11 是较新的版本。据我记得,在我安装它们之后,它们都没有更新其时区数据库。

时区更新工具

由于您使用的是 Oracle Java,解决方案是使用时区更新工具更新 Java 的时区数据库。请参阅底部的链接并按照其中给出的说明进行操作。不过,Stack Overflow 上有几个关于该工具失败的问题,所以我希望您能够解决。最后的手段是安装全新的 Java 运行时环境。

链接

关于java - 为什么 Java 产生的时间比卡萨布兰卡实时时间晚一小时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60319119/

相关文章:

python - 如何在更改 TIME_ZONE 设置时保持 UTC 时间记录?

mysql - 创建DATABASE时的SQL_MODE和TIME_ZONE

mysql - Symfony Doctrine 按日期时间和时区查询条目

javascript - 如何单独从 webelement 中检索可见文本?

c++ - 测量时差

c++ - C++ Srand 值问题

java - 查找两个时间之间的差异时出现的问题

java - 如何在sql中转义 "'”

java - 如何创建一个sql表并获取每个唯一字段的平均价格?

java - JNI 调用 C 函数调用其他文件中的其他函数