Spring中如何仅对单个ZonedDateTime字段禁用时区转UTC,其余字段保留转换规则
解决方案
你可以直接在需要保留原始时区的ZonedDateTime字段上添加Jackson的@JsonDeserialize注解,指定使用不调整时区的反序列化器即可,不需要修改全局配置。
具体实现步骤
- 第一步:自定义一个不调整时区的ZonedDateTime反序列化器
import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.datatype.jsr310.deser.ZonedDateTimeDeserializer; import java.io.IOException; import java.time.ZonedDateTime; public class PreserveZoneZonedDateTimeDeserializer extends ZonedDateTimeDeserializer { public PreserveZoneZonedDateTimeDeserializer() { // 禁用当前反序列化器的时区调整逻辑 super(ZonedDateTimeDeserializer.INSTANCE, null, false); } @Override public ZonedDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { return super.deserialize(p, ctxt); } }
- 第二步:在需要保留原始时区的字段上标注该反序列化器
import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import java.time.ZonedDateTime; public class YourRequestDTO { // 其他字段默认走全局规则,自动转换为UTC private ZonedDateTime defaultUtcTime; // 该字段保留请求传入的原始时区 @JsonDeserialize(using = PreserveZoneZonedDateTimeDeserializer.class) private ZonedDateTime originalZoneTime; // 省略getter、setter方法 }
原理解释
Jackson全局配置的ADJUST_DATES_TO_CONTEXT_TIME_ZONE参数默认值为true,反序列化ZonedDateTime时会自动调整到上下文配置的时区(Spring Boot默认是UTC)。自定义反序列化器时构造方法第三个参数传false,就是单独关闭当前字段的时区调整逻辑,其余字段不受影响,完全匹配你的需求。
内容的提问来源于stack exchange,提问作者MA1
相关产品推荐
相关产品推荐

