springboot 多種時間格式轉(zhuǎn)換

我們知道,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)載請注明出處。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容