SpringBoot入坑指南之七:格式化LocalTime、LocalDate和LocalDateTime
阿新 • • 發佈:2019-07-14
開篇
好久好久沒更新這個文集了,上一次更新我都忘記是什麼時間了,原計劃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則是通過LocalDateTimeSerializer
,LocalDateTimeSerializer
預設使用的是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
尾巴
多點記錄多點積累,無論是一個多小的一個知識點都是自身的增值部分