1. 概述

在使用 MySQL 存储日期类型字段时,你可能遇到过这样的问题:数据库中读取的时间和系统时间(或 JVM 时间)不一致
或者你只是希望你的 Spring Boot 应用运行在某个特定的时区下。

本篇文章将介绍几种在 Spring Boot 中设置 MySQL JDBC 时区的方式,帮助你避免踩坑,保证时间数据的正确性。


2. 通过 JDBC URL 参数指定时区

最常见的方式之一,是在 datasource.url 中通过参数指定连接使用的时区。

我们可以通过添加 connectionTimeZone 参数来设置 MySQL 的连接时区:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test?connectionTimeZone=UTC
    username: root
    password: your_password

✅ 这种方式简单粗暴,适用于大多数 Spring Boot 项目。
⚠️ 注意:connectionTimeZone 是 MySQL Connector/J 支持的一个配置参数,必须确保你的 JDBC 驱动版本支持它。

你也可以通过 Java 配置方式手动配置数据源,而不是使用 application.yml,具体可以参考 Spring Boot 手动配置数据源

更多参数说明可以查看 MySQL 官方文档


3. 使用 Spring Boot 自身配置属性

除了在 URL 中设置,我们还可以通过 Spring Boot 提供的配置属性来指定 Hibernate 使用的时区:

spring:
  jpa:
    properties:
      hibernate:
        jdbc:
          time_zone: UTC

或者使用 properties 格式:

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

✅ 适用于使用 Hibernate 作为 JPA 实现的项目。
⚠️ 该配置不会影响数据库本身的连接时区,仅影响 Hibernate 在处理时间类型时的行为,建议配合 URL 参数一起使用


4. 设置 JVM 默认时区

最后,你也可以通过修改 JVM 的默认时区来影响整个应用的时间处理方式。

在 JDBC URL 中添加 forceConnectionTimeZoneToSession=true,然后在应用启动时修改默认时区:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test?forceConnectionTimeZoneToSession=true

Java 代码中设置默认时区:

@PostConstruct
void started() {
    TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
}

不推荐这种方式,因为它是全局设置,会影响整个应用中所有使用时间的地方。
⚠️ 如果你的项目中需要连接多个数据库,且这些数据库使用不同的时区,这种做法会导致不可预料的问题。


5. 总结

本文我们介绍了三种常见的设置 MySQL JDBC 时区的方式:

方法 描述 推荐程度
✅ JDBC URL 参数 直接、有效,推荐首选方式 ⭐⭐⭐⭐
✅ Spring Boot 配置属性 适合 Hibernate 用户,建议配合 URL 使用 ⭐⭐⭐
❌ 设置 JVM 默认时区 简单但副作用大,慎用

最终推荐使用 JDBC URL 参数 + Hibernate 配置属性 的组合方式,既保证连接时区正确,也确保 ORM 层处理一致。

完整示例代码可查看 GitHub 项目


原始标题:Setting the MySQL JDBC Timezone In Spring Boot | Baeldung