很久很久没更新这个文集了,上一次更新我都忘记是什么时间了,原计划Spring Boot系列会写十几篇文章的,如今才写到第7篇(含本文),后续仍是会继续更新吧,我一直以为,写博客的主要目的是梳理本身的技术栈,分享只是附属价值,因此仍是要坚持下去的~ 本文主要说说如何格式化Restful接口的时间类型,从JDK8开始提供了更方便日期时间的API,如:LocalTime、LocalDate和LocalDateTime,今后能够远离原来的Date和Calendar类,日期操做变得简单多了。java
然而,在Spring Boot进行Restful接口开发中使用这些日期时间类型时,你会发现使用jackson的spring.jackson.date-format
配置进行日期类型格式化是无效的,为何呢?git
//如下是配置了`spring.jackson.date-format=yyyy-MM-dd HH:mm:ss`后, //接口返回LocalDateTime和Date的内容,你会发现Date类型的已经格式化, //可是LocalDateTime却没有。 { "localDateTime": "2019-07-14T12:20:23.615", "date": "2019-07-14 04:20:23" }
实际上在Jackson序列化的时候,会根据不一样类型调用不一样的Serializer
进行序列化,若是没有默认的Serializer
时,调用的是类的toString()
。而Date类型序列化时会使用DateSerializer
,里面会使用spring.jackson.date-format
中的配置,而LocalDateTime则是经过LocalDateTimeSerializer
,LocalDateTimeSerializer
默认使用的是DateTimeFormatter.ISO_LOCAL_DATE_TIME
,因此就会返回上面的结果。spring
经过上文能够知道,若是可以覆盖默认的LocalDateTimeSerializer
,就能够按照本身的需求进行日期格式化了。app
经过如下方式能够实现:spring-boot
Jackson2ObjectMapperBuilderCustomizer
的Bean,分别指定LocalDate、LocalDateTime和LocalTime的序列化和反序列化类(按须要定义对应的DatetimeFormatter),参考代码以下:import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer; import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.format.DateTimeFormatter; /** * @Author Cent.Chen 2019-07-14 * @Description Dateformat Configuration. */ @Configuration public class DateformatConfig { /** * Date格式化字符串 */ private static final String DATE_FORMAT = "yyyy-MM-dd"; /** * DateTime格式化字符串 */ private static final String DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss"; /** * Time格式化字符串 */ private static final String TIME_FORMAT = "HH:mm:ss"; /** * 自定义Bean * * @return */ @Bean @Primary public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() { return builder -> builder.serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DATETIME_FORMAT))) .serializerByType(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DATE_FORMAT))) .serializerByType(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(TIME_FORMAT))) .deserializerByType(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DATETIME_FORMAT))) .deserializerByType(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DATE_FORMAT))) .deserializerByType(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(TIME_FORMAT))); } }
{ "localDateTime": "2019-07-14 12:33:11", "date": "2019-07-14 04:33:11" }
码云:https://gitee.com/centy/spring-boot-examples/tree/master/spring-boot-examples-dateformat测试
多点记录多点积累,不管是一个多小的一个知识点都是自身的增值部分,厚积而薄发!ui