gpt4 book ai didi

java - 如果应用程序使用不同于 MySQL 的时区,则 Hibernate 保存/检索日期减去天数

转载 作者:IT老高 更新时间:2023-10-29 00:07:53 25 4
gpt4 key购买 nike

我在 MACHINE_A 上的 tomcat 上启动了一个应用程序,时区为 GMT+3。

我使用在 MACHINE_B 上启动的远程 MySQL 服务器,时区为 UTC。

我们使用 spring-data-jpa 进行持久化。

作为问题的一个例子,我将展示存储库:

public interface MyRepository extends JpaRepository<MyInstance, Long> {
Optional<MyInstance> findByDate(LocalDate localDate);
}

如果我为 2018-09-06 传递 localDate,我会得到日期为 2018-09-05(前一天)的实体

在我看到的日志中:

2018-09-06 18:17:27.783 TRACE 13676 --- [nio-8080-exec-3] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [DATE] - [2018-09-06]

我用谷歌搜索了很多这个问题,发现了几篇内容相同的文章(例如 https://moelholm.com/2016/11/09/spring-boot-controlling-timezones-with-hibernate/ )

所以,我有以下 application.yml:

spring:
datasource:
url: jdbc:mysql://localhost:3306/MYDB?useUnicode=true&characterEncoding=utf8&useSSL=false&useLegacyDatetimeCode=false&serverTimezone=UTC
username: root
password: *****
jpa:
hibernate:
naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
properties:
hibernate:
show_sql: true
use_sql_comments: true
format_sql: true
type: trace
jdbc:
time_zone: UTC

但这并没有帮助。

我们使用以下连接器:

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.12</version>
</dependency>

如何解决我的问题?

附言

我尝试在同一时区运行这两个应用程序。在这种情况下,一切都按预期工作。

附言2

我尝试使用 MySQL 驱动程序 6.0.6 版本,但它没有任何改变。

最佳答案

如果您在 Java 中使用 LocalDate,则应该在 MySQL 中使用 DATE 列。这样问题就迎刃而解了。

如果您使用 LocalDateTime,请尝试在 Spring Boot 中设置如下属性:

spring.jpa.properties.hibernate.jdbc.time_zone=UTC

要查看它的运行情况,您可以在我的 High-Performance Java Persistence GitHub repository 中找到一个测试用例它演示了此设置如何与 MySQL 一起使用。

关于java - 如果应用程序使用不同于 MySQL 的时区,则 Hibernate 保存/检索日期减去天数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52207233/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com