You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL+Hibernate日期返回异常:数据库与代码日期差1天18:00

问题定位与解决步骤

1. 先确认数据库中日期的实际存储情况

  • 检查你的日期字段类型:是DATE、DATETIME还是TIMESTAMP?
    • 如果是DATE类型,MySQL存储的是纯日期(不带时间),但Hibernate读取时会自动补00:00:00,再结合时区转成JVM层面的时间。
  • 直接在MySQL客户端执行查询,验证原始值:
    SELECT your_date_column, CAST(your_date_column AS DATETIME) FROM your_table WHERE id = [目标记录ID];
    
    确认返回结果是否为2023-01-14 00:00:00。

2. 修正JDBC连接URL的时区参数

你当前的URL仅设置了serverTimezone=UTC,建议补充两个关键参数,强制驱动正确处理时区转换(注意XML中&需转义为&):

<property name="connection.url">jdbc:mysql://localhost:3306/metsa?serverTimezone=UTC&amp;useTimezone=true&amp;useLegacyDatetimeCode=false</property>

3. 调整Hibernate的日期映射与时区配置

  • 优先使用Java 8的LocalDate类型(纯日期,无时区依赖)映射数据库DATE字段:
    @Column(name = "your_date_column")
    private LocalDate yourDate;
    
  • 如果必须使用java.util.Date/java.sql.Date,需在Hibernate配置中强制指定JDBC时区:
    <property name="hibernate.jdbc.time_zone">UTC</property>
    
    同时在实体类字段上明确标注日期类型:
    @Column(name = "your_date_column")
    @Temporal(TemporalType.DATE)
    private Date yourDate;
    

4. 强制JVM使用UTC时区

你得到的2023-01-13 18:00:00是UTC-6时区的时间,说明应用运行的JVM默认时区为UTC-6。解决方式:

  • 启动应用时添加JVM参数:
    -Duser.timezone=UTC
    
  • 或在代码初始化阶段设置:
    TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
    

5. 确保MySQL时区设置永久生效

你临时执行的SET @@global.time_zone = '+00:00';在MySQL重启后会失效。要永久配置,找到MySQL的配置文件(Linux为my.cnf,Windows为my.ini),在[mysqld]段添加:

[mysqld]
default-time-zone = '+00:00'

重启MySQL服务后,执行SELECT @@global.time_zone, @@session.time_zone;确认时区为UTC。


内容的提问来源于stack exchange,提问作者geraldgangsta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 21:55:15