美文网首页Spring Boot入坑指南springboot2
SpringBoot入坑指南之七:格式化LocalTime、Lo

SpringBoot入坑指南之七:格式化LocalTime、Lo

作者: centychen | 来源:发表于2019-07-14 12:48 被阅读0次

    开篇

    好久好久没更新这个文集了,上一次更新我都忘记是什么时间了,原计划Spring Boot系列会写十几篇文章的,现在才写到第7篇(含本文),后续还是会继续更新吧,我一直觉得,写博客的主要目的是梳理自己的技术栈,分享只是附属价值,所以还是要坚持下去的~
    本文主要说说如何格式化Restful接口的时间类型,从JDK8开始提供了更方便日期时间的API,如:LocalTime、LocalDate和LocalDateTime,从此可以远离原来的Date和Calendar类,日期操作变得简单多了。

    SpringBoot日期格式化问题

    然而,在Spring Boot进行Restful接口开发中使用这些日期时间类型时,你会发现使用jackson的spring.jackson.date-format配置进行日期类型格式化是无效的,为什么呢?

    //以下是配置了`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则是通过LocalDateTimeSerializerLocalDateTimeSerializer默认使用的是DateTimeFormatter.ISO_LOCAL_DATE_TIME,所以就会返回上面的结果。

    如何处理?

    通过上文可以知道,如果能够覆盖默认的LocalDateTimeSerializer,就可以按照自己的需求进行日期格式化了。

    通过以下方式可以实现:

    • 自定义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

    尾巴

    多点记录多点积累,无论是一个多小的一个知识点都是自身的增值部分,厚积而薄发!

    相关文章

      网友评论

        本文标题:SpringBoot入坑指南之七:格式化LocalTime、Lo

        本文链接:https://www.haomeiwen.com/subject/fsoaoqtx.html