SpringBoot环境Json对Date类型的处理
SpringBoot
环境下默认使用的json库为Jackson
,其默认使用ObjectMapper
对数据进行序列化和反序列化处理。当对Date
类型的数据进行序列化时,默认使用YYYY-MM-DDTHH:mm:ss
格式。且由于Jackson
默认使用UTC时间标准(GMT+0),而我们国家默认是CST时间(GMT+8),也就是当数据以字符型
数据传输时,将比CST时间少8小时。
Json Date自定义序列化和反序列化
序列化+反序列化 同时指定为YYYY-MM-DD
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.*;
import org.springframework.context.annotation.Configuration;
import java.text.SimpleDateFormat;
@Configuration
public class MyObjectMapper extends ObjectMapper {
public MyObjectMapper() {
this.setSerializationInclusion(JsonInclude.Include.NON_NULL);
this.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);
this.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
this.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
this.setDateFormat(new SimpleDateFormat ("yyyy-MM-dd"));
}
}
适用场景
- A、B两系统交互,且均使用
yyyy-MM-dd
的时间格式
单独对序列化指定日期格式
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.*;
import org.springframework.context.annotation.Configuration;
import java.text.SimpleDateFormat;
@Configuration
public class MyObjectMapper extends ObjectMapper {
public MyObjectMapper() {
this.setSerializationInclusion(JsonInclude.Include.NON_NULL);
this.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);
this.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
this.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
SerializationConfig with = new ObjectMapper().getSerializationConfig().with(new SimpleDateFormat("yyyy-MM-dd"));
this.setConfig(with);
}
}
适用场景
- A、B两系统交互,A使用
yyyy-MM-ddTHH:mm:ss
,而B系统出于某种需要使用yyyy-MM-dd
编码向外传输数据。此时只能对B系统的序列化单独指定格式。而反序列化仍然保持默认配置即可。
注意
Jackson
在进行数据传输时,默认使用UTC时间进行。再由接收端进行时区转换,若此时交互系统的日期格式不一致,可能导致日期无法被正确还原。
- A 系统使用
yyyy-MM-ddTHH:mm:ss
序列化日期 - B系统使用
yyyy-MM-dd
反序列化 - 此时A系统需要将
2020-10-01
发送到B系统时,A实际发送的是2020-09-30T16:00:00
(UTC时间比CST少8小时) - 若此时B系统采用
yyyy-MM-dd
反序列化,将直接导致日期后面的时间被截断,从而接收到2020-09-30
,此时日期少一天