我們知道,springboot 有個配置時間格式的參數(shù):spring.jackson.date-format。
通常使用方式是:
spring:jackson:date-format:yyyy-MM-dd HH:mm:ss
如果我需要傳 yyyy-MM-dd 格式的話,那就只能再加個 @JsonFormat 注解來為它單獨指定格式。有沒有更方便的辦法呢?
?spring.jackson.date-format幫我們做了什么?
到源碼中可以看到,date-format 原本應該是接收一個 DateFormat 的類路徑的,但我們一般寫的是一個時間格式字符串,所以默認使用的 DateFormat 的子類 SimpleDateFormat 來為我們轉(zhuǎn)換時間格式。其實我們大可以傳一個自定義的 DateFormat 類進去。

Untitled.png
?? 既然方案找到了,那么實現(xiàn)起來就很簡單了,我們自定義一個類,繼承 DateFormat,但實際上,如果直接繼承 DateFormat 抽象類,你可能還需要像 SimpleDateFormat 一樣,在里面需要自己初始化一堆復雜的參數(shù),其實我們需要的僅僅是讓它支持多種時間格式,而 SimpleDateFormat 已經(jīng)為我們做好了這一切,不同的只是需要我們?yōu)樗付ú煌母袷筋愋?,所以,可以直接繼承 SimpleDateFormat,然后重寫它的 parse 和 format 方法即可達到我們的目的。
packagecom.yc.kfpt.webcommons.plugin;importjava.text.DateFormat;importjava.text.FieldPosition;importjava.text.ParsePosition;importjava.text.SimpleDateFormat;importjava.util.ArrayList;importjava.util.Date;importjava.util.List;/**
* 支持多種時間格式轉(zhuǎn)換,使用方法
* <code>
* spring:
*? jackson:
*? ? date-format: com.yc.kfpt.webcommons.plugin.DateFormatPlugin
* </code>
* @author 敖癸
* @formatter:on
* @since 2022/11/4
*/publicclassDateFormatPluginextendsSimpleDateFormat{privatestaticfinalList<DateFormat>FORMATS=newArrayList<>(5);privatestaticfinalStringYYYY_MM="^\\d{4}-\\d{1,2}$";privatestaticfinalStringYYYY_MM_DD="^\\d{4}-\\d{1,2}-\\d{1,2}$";privatestaticfinalStringYYYY_MM_DD_HH_MM="^\\d{4}-\\d{1,2}-\\d{1,2} \\d{1,2}:\\d{1,2}$";privatestaticfinalStringYYYY_MM_DD_HH_MM_SS="^\\d{4}-\\d{1,2}-\\d{1,2} \\d{1,2}:\\d{1,2}:\\d{1,2}$";privatestaticfinalStringYYYY_MM_DD_HH_MM_SS_SSS="^\\d{4}-\\d{1,2}-\\d{1,2} \\d{1,2}:\\d{1,2}:\\d{1,2}\\.\\d{3}$";static{FORMATS.add(newSimpleDateFormat("yyyy-MM"));FORMATS.add(newSimpleDateFormat("yyyy-MM-dd"));FORMATS.add(newSimpleDateFormat("yyyy-MM-dd HH:mm"));FORMATS.add(newSimpleDateFormat("yyyy-MM-dd HH:mm:ss"));FORMATS.add(newSimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"));}@OverridepublicStringBufferformat(Datedate,StringBuffertoAppendTo,FieldPositionfieldPosition){returnFORMATS.get(3).format(date,toAppendTo,fieldPosition);}@OverridepublicDateparse(Stringsource,ParsePositionpos){Stringvalue=source.trim();if("".equals(value)){returnnull;}if(source.matches(YYYY_MM)){returnFORMATS.get(0).parse(source,pos);}elseif(source.matches(YYYY_MM_DD)){returnFORMATS.get(1).parse(source,pos);}elseif(source.matches(YYYY_MM_DD_HH_MM)){returnFORMATS.get(2).parse(source,pos);}elseif(source.matches(YYYY_MM_DD_HH_MM_SS)){returnFORMATS.get(3).parse(source,pos);}elseif(source.matches(YYYY_MM_DD_HH_MM_SS_SSS)){returnFORMATS.get(4).parse(source,pos);}else{thrownewIllegalArgumentException("Invalid datetime value "+source);}}}
最后,我們再修改我們的配置,把 spring.jackson.date-format 指定我們自定義的DateFormat 子類。
spring:jackson:date-format:com.yc.kfpt.webcommons.plugin.DateFormatPlugin
如此,我們就能同時支持前端傳過來的各種時間格式了,我們只需要用 Date 接收,剩下的就都交給 DateFormat 來幫我們完成了。
作者:DimonHo
鏈接:http://www.itdecent.cn/p/12b47cffd3ad
來源:簡書
著作權歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權,非商業(yè)轉(zhuǎn)載請注明出處。