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

Hibernate与SpringMVC中日期存取差一天问题排查

问题分析与解决方案

问题本质

查询时日期比数据库记录早一天、更新时保存的日期比预期晚一天,核心原因是时区不匹配导致的日期转换错误:

  • java.util.Date是带UTC时区的时间对象,而数据库DATE类型仅存储日期(无时区信息)
  • Hibernate在映射Date与DATE类型时,若未正确配置时区,会在UTC与本地时区转换过程中出现日期偏移

解决方案

1. 配置Hibernate时区参数

在Hibernate配置文件或Spring配置中指定与数据库一致的时区,消除转换偏差:

方式1:hibernate.cfg.xml配置

<property name="hibernate.jdbc.time_zone">Asia/Shanghai</property>

方式2:Spring application.properties配置

spring.jpa.properties.hibernate.jdbc.time_zone=Asia/Shanghai

2. 替换java.util.Date为java.time.LocalDate(推荐)

LocalDate是Java 8+提供的无时区日期类型,完全匹配数据库DATE字段特性,从根源避免时区转换问题。修改实体类如下:

@Entity
@Table(name = "cliente_tickets")
public class ClienteTicket {

    ... other fields...

    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @Column(name = "created_on", columnDefinition = "DATE")
    private LocalDate createdOn;

    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @Column(name = "updated_on", columnDefinition = "DATE")
    private LocalDate updatedOn;

    // Getter & Setter
    public LocalDate getCreatedOn() {
        return createdOn;
    }

    public void setCreatedOn(LocalDate createdOn) {
        this.createdOn = createdOn;
    }

    public LocalDate getUpdatedOn() {
        return updatedOn;
    }

    public void setUpdatedOn(LocalDate updatedOn) {
        this.updatedOn = updatedOn;
    }
}

同步修改Service层的日期赋值逻辑:

@Override
@Transactional
public void guardar(ClienteTicket clienteTicket) {
    if (clienteTicket.getCreatedBy() == null || clienteTicket.getCreatedBy().length() == 0) {
        clienteTicket.setCreatedOn(LocalDate.now());
        clienteTicket.setCreatedBy(Utilidades.currentUser());
    } else {
        clienteTicket.setUpdatedOn(LocalDate.now());
        clienteTicket.setUpdatedBy(Utilidades.currentUser());
    }
    this.clienteTicketDao.guardar(clienteTicket);
}

3. 修正数据库连接URL时区参数

如果使用MySQL等数据库,在JDBC连接URL中指定时区,避免驱动与数据库的时区差异:

spring.datasource.url=jdbc:mysql://localhost:3306/your_db?serverTimezone=Asia/Shanghai&useSSL=false

4. 验证服务器系统时区

确保应用服务器的系统时区与数据库一致,避免系统层面的时区偏移:

# Linux/macOS查看时区
date +%Z

# Windows查看时区
tzutil /l

验证步骤

  1. 应用配置后重启服务
  2. 新增测试数据,检查数据库存储日期是否符合预期
  3. 查询该数据,验证返回日期与数据库记录完全匹配

内容的提问来源于stack exchange,提问作者Angel De Jesus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 12:39:50