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
相关产品推荐
相关产品推荐

