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

Spring Boot如何阻止Jackson自动转换时区,全局保留Date原日期

Spring Boot RestController中Jackson时区自动转换问题解决

问题描述

在Spring Boot的RestController接收请求时,Jackson会自动将传入的日期转换为当前时区,导致日期不符合预期。例如:

  • 传入数据:
    "NGAY": "2022-07-29T17:00:00.000+00:00"
    
  • 期望接收后日期为:2022-07-29
  • 实际被转换为:2022-07-30

相关代码

实体类字段

@Column(name = "NGAY")
private java.util.Date ngay;

RestController代码

@RestController
@RequestMapping("/api/sanluong/ngay")
public class Controller {
    @PostMapping("/savedata")
    public ResponseEntity<?> uploadFile(@RequestBody List<MLoadprofileView> lstData)  {
        ResponseData result = sanLuongNgayService.onSaveData(lstData);
        return ResponseEntity.ok(result);
    }
}

无效的配置尝试

曾在application.properties中配置以下内容,但未解决问题:

spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false
spring.jackson.deserialization.ADJUST_DATES_TO_CONTEXT_TIME_ZONE = false

需求:配置需全局生效,覆盖所有类中的java.util.Date字段。


解决方案

方案1:全局配置文件调整

在application.properties中补充以下配置,强制Jackson使用UTC时区并指定日期解析格式:

# 指定Jackson全局时区为UTC
spring.jackson.time-zone=UTC
# 设置日期反序列化格式,只保留年月日部分
spring.jackson.deserialization.date-format=yyyy-MM-dd
# 禁用自动调整日期到上下文时区
spring.jackson.deserialization.ADJUST_DATES_TO_CONTEXT_TIME_ZONE=false

方案2:自定义Jackson配置类

如果配置文件方式不生效,可通过配置类全局定制Jackson行为:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.text.SimpleDateFormat;
import java.util.TimeZone;

@Configuration
public class JacksonConfig {
    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        // 固定时区为UTC
        objectMapper.setTimeZone(TimeZone.getTimeZone("UTC"));
        // 关闭时区自动调整
        objectMapper.disable(SerializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);
        // 设置全局日期解析格式
        objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));
        return objectMapper;
    }
}

方案3:字段级注解兜底

若全局配置仍有个别字段不生效,可直接在Date字段上添加注解强制指定规则:

@Column(name = "NGAY")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "UTC")
private java.util.Date ngay;

说明

java.util.Date本身仅存储从1970-01-01 UTC开始的毫秒数,不带时区信息。Jackson默认会根据当前上下文时区转换日期,通过强制指定UTC时区和固定日期格式,可确保解析后的日期与传入的年月日部分一致,不受时区偏移影响。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 16:06:27