SpringBoot入坑指南之七:格式化LocalTime、LocalDate和LocalDateTime

開篇

很久很久沒更新這個文集了,上一次更新我都忘記是什麼時間了,原計劃Spring Boot系列會寫十幾篇文章的,如今才寫到第7篇(含本文),後續仍是會繼續更新吧,我一直以爲,寫博客的主要目的是梳理本身的技術棧,分享只是附屬價值,因此仍是要堅持下去的~ 本文主要說說如何格式化Restful接口的時間類型,從JDK8開始提供了更方便日期時間的API,如:LocalTime、LocalDate和LocalDateTime,今後能夠遠離原來的Date和Calendar類,日期操做變得簡單多了。java

SpringBoot日期格式化問題

然而,在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則是經過LocalDateTimeSerializerLocalDateTimeSerializer默認使用的是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

相關文章
相關標籤/搜索