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

Java接口返回日期自动从GMT转系统时区问题及解决诉求

解决接口返回日期时区偏移问题

问题本质

java.util.Date本质是UTC时间戳,本身不带时区信息。数据库存储的dd/MM/yyyy会被解析为GMT时区当天的0点,返回时Jackson默认用系统时区序列化,就会出现日期偏移(比如你遇到的31/03/2021变成30/03/2021 22:00:00,说明系统时区是GMT+2)。

核心解决方案

1. 替换Date为LocalDate(推荐)

业务场景是日期(无时间、无时区),用Java 8+的java.time.LocalDate更贴合需求,完全避免时区问题:

  • 实体类字段修改:
    import java.time.LocalDate;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    
    @Entity
    public class YourEntity {
        @Column(columnDefinition = "DATE") // 对应数据库DATE类型
        private LocalDate yourDate;
        // getter/setter
    }
    
  • 接口返回直接用LocalDate,如果要指定dd/MM/yyyy格式,加注解:
    import com.fasterxml.jackson.annotation.JsonFormat;
    
    @JsonFormat(pattern = "dd/MM/yyyy")
    private LocalDate yourDate;
    

2. 强制Jackson序列化时区为GMT(兼容旧代码)

如果必须保留java.util.Date,配置Jackson用GMT时区序列化,确保和数据库解析的时区一致:

  • 全局配置(Spring Boot):
    在application.properties添加:
    spring.jackson.timezone=GMT
    spring.jackson.date-format=dd/MM/yyyy
    
  • 局部字段配置:
    import com.fasterxml.jackson.annotation.JsonFormat;
    import java.util.Date;
    
    @JsonFormat(pattern = "dd/MM/yyyy", timezone = "GMT")
    private Date yourDate;
    

排查之前方案失效的原因

  • 工具类抽离后,可能未正确注册Jackson配置(比如自定义序列化器没被Spring扫描到)
  • 恢复原代码后存在缓存,尝试重启应用清除序列化配置缓存
  • 确认调试环节:在控制器返回前,打印date.getTime(),对比数据库存储的时间戳是否一致,若一致则问题肯定出在序列化阶段

内容的提问来源于stack exchange,提问作者Issam El omri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 10:27:15