巴西的 ZonedDateTime 仍然得到 -2 而不是 -3 偏移量

Posted

技术标签:

【中文标题】巴西的 ZonedDateTime 仍然得到 -2 而不是 -3 偏移量【英文标题】:ZonedDateTime in Brazil still getting -2 instead of -3 offset 【发布时间】:2020-06-05 06:33:19 【问题描述】:

我正在开发一个使用 Java 8、Maven 和 Spring 的应用程序。自 2019 年起,巴西取消了夏令时。

基本上,我将系统中的所有日期更改为以 utc 格式保存,并以使用该应用程序的人的时区显示。大多数用户来自巴西

为了解决时区问题,我将 JRE 和 JDK 更新到了最新版本的 java 8,因此所有显示为夏令时的日期开始恢复正常时间。 这样我就可以转换日期了,我已经这样做了大约两个星期了

问题是,今天午餐时间前后,我所做的所有转换都突然返回显示夏令时,即使根本没有更新任何内容

例子:

calculatedList.forEach(dto -> 
    LocalDateTime date = dto.getResultDate();

    dto.setResultDate(date.atZone(ZoneId.of("UTC")).withZoneSameInstant(ZoneId.of("America/Sao_Paulo")).toLocalDateTime());
);

当我编写此代码时,我确保转换采用 utc 日期并将其带到 -3。现在同样的方法正在转换为 -2

我已经编写这样的代码 2 周了,到目前为止一切正常。这是一个非常模糊的问题,但我无法想象我可能做了什么让时区出错。谁能帮我理解发生了什么?

【问题讨论】:

您使用的是哪个 JRE8 更新? 我在Java的控制面板更新。 尝试在你的代码中添加System.out.println(System.getProperty("java.version"));,看看输出是什么。 输出为 1.8.0_221。问题肯定就在这里!但我的变量都指向版本 1.8.0_241 【参考方案1】:

根据此页面:https://www.oracle.com/technetwork/java/javase/tzdata-versions-138805.html

巴西不再遵守夏令时,因为:

13.0.1 11.0.5 8u231 7u241

虽然您的 Java 版本是 1.8.0_221,但不包括该更改。

【讨论】:

但是 JAVA_HOME 指向的是 C:\Program Files\Java\jdk1.8.0_241 你如何运行你的应用程序? 使用 Maven。 mvn spring-boot:run 试试java -version java 版本 "1.8.0_241" Java(TM) SE Runtime Environment (build 1.8.0_241-b07) Java HotSpot(TM) 64-Bit Server VM (build 25.241-b07, mixed mode)

以上是关于巴西的 ZonedDateTime 仍然得到 -2 而不是 -3 偏移量的主要内容,如果未能解决你的问题,请参考以下文章

Java 8:计算两个 ZonedDateTime 之间的差异

客户端发送的请求在语法上不正确 Java ZonedDateTime 后端

无法使用Java 8中的DateTimeFormatter和ZonedDateTime从TemporalAccessor获取ZonedDateTime

在时区将 ZonedDateTime 转换为 LocalDateTime

Java - 比较两个 ZonedDateTime 时的结果与预期不符

Java 8:如何从 Epoch 值创建 ZonedDateTime?