SpringBoot基于注解實現全局日期格式化

首先根據項目要求提供自定義的日期序列化器和反序列化器,其中包括:

  • DateJsonSerializerextendsJsonSerializer 表示將Date格式化為日期字符串。
  • DateJsonDeserializerextendsJsonDeserializer 表示將日期字符串解析為Date日期。

使用注解 @JsonComponent 可以快速自定義日期格式化的序列化器,免除傳統通過模塊注冊的煩惱。
使用注解 @JsonComponent 實現與當地無關的動態時區的精髓就在于將獲取當前等人的方法寫在解析日期和格式化日期的代碼里。
使用注解 @JsonComponent 是直接處理String和Date的相互轉換的,所以要注意空串問題。例如dateFormat.parse()要預防空串

@JsonComponent自定義日期格式化的序列化器

@JsonComponent
public class DateFormatCofig{private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");/*** 日期格式化*/public static class DateJsonSerializer extends JsonSerializer<Date> {@Overridepublic void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {jsonGenerator.writeString(dateFormat.format(date));}}/*** 解析日期字符串*/public static class DateJsonDeserializer extends JsonDeserializer<Date> {@Overridepublic Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {try {return dateFormat.parse(jsonParser.getText());} catch (ParseException e) {throw new RuntimeException(e);}}}
}

Controller進行測試

@RestController
public class UserController {@GetMapping("/")public User get() {return new User("1", "socks", "123456", new Date(), "GMT");}
}
public class User {private String userId;private String username;private String password;private Date createTime;private String timezone;public User(String userId, String username, String password, Date createTime, String timezone) {this.userId = userId;this.username = username;this.password = password;this.createTime = createTime;this.timezone = timezone;}//省略getters&setters
}

啟動應用并訪問 http://127.0.0.1:8080 ,可以拿到正確結果:

{"userId": "1","username": "socks","password": "123456","createTime": "2018-12-26 01:03:25"
}

除了日期格式化解析之外,我們還可以在 DateFormatConfig 注入業務變量,例如根據當前登錄人的所屬時區(雖然 SimpleDateFormat默認讀取了當地時區,但在實際的國際化系統中,用戶的所屬時區是指其在系統錄入的所屬時區,而不是指當地時區。例如Tony這個用戶賬號掛在GMT+0時區,但此時他出差在香港使用,系統仍需要按照GMT+0時區來顯示時間),為了解決這個問題,此時我們可以在 DateFormatConfig 注入當前登錄人然后改變日期工具類的 TimeZone來動態修改時區。

@JsonComponent
public class DateFormatConfig {private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z") {@Overridepublic Date parse(String source) throws ParseException {try {if (StringUtils.isEmpty(source)) {return null;}return super.parse(source);} catch (Exception e) {return new StdDateFormat().parse(source);}}};private static UserController userController;//這里是指獲取當前登錄人的工具類@Autowiredpublic void setUserController(UserController userController) {DateFormatConfig.userController = userController;}/*** 日期格式化*/public static class DateJsonSerializer extends JsonSerializer<Date> {@Overridepublic void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {//獲取當前登錄人的所屬時區dateFormat.setTimeZone(TimeZone.getTimeZone(userController.get().getTimezone()));//格式化日期jsonGenerator.writeString(dateFormat.format(date));}}/*** 解析日期字符串*/public static class DateJsonDeserializer extends JsonDeserializer<Date> {@Overridepublic Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {try {//獲取當前登錄人的所屬時區dateFormat.setTimeZone(TimeZone.getTimeZone(userController.get().getTimezone()));//解析日期return dateFormat.parse(jsonParser.getText());} catch (ParseException e) {throw new RuntimeException(e);}}}
}

修改完后重新啟動應用并訪問 http://127.0.0.1:8080 ,可以拿到正確結果:

{"userId": "1","username": "socks","password": "123456","createTime": "2018-12-25 17:35:50 +0000","timezone": "GMT"
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/712792.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/712792.shtml
英文地址,請注明出處:http://en.pswp.cn/news/712792.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

openGauss學習筆記-232 openGauss性能調優-系統調優-資源負載管理-資源管理準備-資源規劃

文章目錄 openGauss學習筆記-232 openGauss性能調優-系統調優-資源負載管理-資源管理準備-資源規劃 openGauss學習筆記-232 openGauss性能調優-系統調優-資源負載管理-資源管理準備-資源規劃 完成資源負載管理功能配置前&#xff0c;需要先根據業務模型完成租戶資源的規劃。業…

紹興市新昌縣人大一行蒞臨迪捷軟件走訪考察

2024年2月29日下午&#xff0c;紹興市新昌縣人大常委會副主任王敏慧一行蒞臨迪捷軟件走訪考察&#xff0c;紹興市委科創委副主任、科創走廊建設領導小組副組長、市人大一級巡視員王繼崗&#xff0c;紹興市科技局副局長、科創走廊建設辦公室常務副主任梁楓陪同。 王主任一行聽取…

九州金榜|導致孩子厭學因素有哪些?家庭教育中要怎樣解決?

現在如今孩子出現厭學的情況越來越嚴重&#xff0c;這也難壞了很多家長&#xff0c;眾所周知&#xff0c;當下社會競爭越來越激烈&#xff0c;孩子的壓力也越來越大&#xff0c;這也是導致孩子厭學的主要因素。其實家庭因素也是引起孩子厭學情緒產生的重要原因&#xff0c;在家…

數據結構——二叉樹的基本概念及順序存儲(堆)

目錄 一.前言 二.樹概念及結構 2.1 樹的概念 2.2 樹的相關概念 2.3 樹的表現 2.4 樹在實際中的應用&#xff08;表示文件系統的目錄樹結構&#xff09; 三.二叉樹的概念及結構 3.1 概念 3.2 特殊的二叉樹 3.3 二叉樹的性質 3.4 二叉樹的存儲結構 3.4.1 順序存儲 3…

YOLOv9有效提點|加入SE、CBAM、ECA、SimAM等幾十種注意力機制(一)

專欄介紹&#xff1a;YOLOv9改進系列 | 包含深度學習最新創新&#xff0c;主力高效漲點&#xff01;&#xff01;&#xff01; 一、本文介紹 本文將以SE注意力機制為例&#xff0c;演示如何在YOLOv9種添加注意力機制&#xff01; 《Squeeze-and-Excitation Networks》 SENet提出…

向上生長筆記

第一章 成為一個很厲害的人(持續輸入&#xff0c;反復練習) 為什么要學習及如何學習 1、自毀趨勢(熵增)&#xff0c;故需要能量輸入(負熵流) //引申&#xff1a;水往低處流是趨勢&#xff0c;學習是逆趨勢。 2、持續輸入能量&#xff08;物質和信息&#xff09;&#xff0c;…

linux本地安裝nginx教程

1.安裝編譯工具及庫文件 yum -y install make zlib zlib-devel gcc-c libtool openssl openssl-devel pcre-devel 2.下載 nginx包到指定位置 wget https://nginx.org/download/nginx-1.18.0.tar.gz 3.解壓包 tar -zxvf nginx-1.18.0.tar.gz #解壓 4.在你想安裝nginx的…

力扣2月最后三天的每日一題

力扣2月最后三天的每日一題 前言2867.統計樹中的合法路徑數目思路確定1e5中的質數統計每個點的連接情況開始對質數點進行處理完整代碼 2673.使二叉樹所有路徑值相等的最小代價思路完整代碼 2581.統計可能的樹根數目思路建立連通關系將猜測數組變為哈希表&#xff0c;方便查詢利…

2280. 最優標號(最小割,位運算)#困難,想不到

活動 - AcWing 給定一個無向圖 G(V,E)&#xff0c;每個頂點都有一個標號&#xff0c;它是一個 [0,2^31?1] 內的整數。 不同的頂點可能會有相同的標號。 對每條邊 (u,v)&#xff0c;我們定義其費用 cost(u,v) 為 u 的標號與 v 的標號的異或值。 現在我們知道一些頂點的標號…

七通道NPN 達林頓管GC2003,專為符合標準 TTL 而制造,最高工作電壓 50V,耐壓 80V

GC2003 內部集成了 7 個 NPN 達林頓晶體管&#xff0c;連接的陣列&#xff0c;非常適合邏輯接口電平數字電路&#xff08;例 如 TTL&#xff0c;CMOS 或PMOS 上/NMOS&#xff09;和較高的電流/電壓&#xff0c;如電燈電磁閥&#xff0c;繼電器&#xff0c;打印機或其他類似的負…

讀《代碼整潔之道》有感

最近讀了一本書&#xff0c;名字大家都看到了&#xff1a;《代碼整潔之道》&#xff0c;之前一直只是聽說過這本書的大名&#xff0c;卻一直沒有進行拜讀&#xff0c;最近想起來了就想著看一看&#xff0c;不看不要緊&#xff0c;看了之后就像吃了炫邁&#xff0c;根本停不下來…

MATLAB環境下腦電信號EEG的譜分析

腦電信號一直伴隨著人類的生命&#xff0c;腦電波是腦神經細胞發生新陳代謝、離子交換時細胞群興奮突觸電位總和&#xff0c;腦電信號的節律性則和丘腦相關&#xff0c;含有豐富的大腦活動信息。通常我們所接觸的腦電圖都是頭皮腦電圖&#xff0c;在有些特殊場合還需要皮下部位…

10.廣域網技術

1. PPP實驗點這里&#xff08;拓撲代碼&#xff09; 2. PPPoE配置實驗點這里&#xff08;拓撲代碼&#xff09; 目錄 一、廣域網二、PPP協議三、PPP鏈路建立過程1-LCP&#xff08;鏈路協商&#xff09;四、PPP鏈路建立過程2-PAP/CHAP&#xff08;認證協商&#xff0c;可選&…

linux系統多個mysql時的部署和服務注冊

在一次實際部署過程中,碰到了服務器已經部署了一個mysql服務. 再部署新的mysql時,特別注意不能與另一個mysql互相影響.記錄一次部署中存在的問題和解決方法. 因為已存在mysql,新的mysql部署采用的是mysql.tar.gz解壓手動安裝,避免.rpm或者.deb等自動安裝方式覆蓋了已有mysql的配…

python語言1

一、pytho中的注釋 1.1注釋的理解 程序員在代碼中對代碼功能解釋說明的標注性文字可以提高代碼的可讀性注釋的內容將被python解釋器忽略&#xff0c;不被計算機執行 1.2注釋的分類 注釋分為&#xff1a;單行注釋、多行注釋、中文聲明注釋 &#xff08;1&#xff09;單行注…

LeetCode240題:搜索二維矩陣II(python3)

代碼思路&#xff1a; “根節點” 對應的是矩陣的 “左下角” 和 “右上角” 元素&#xff0c;以 matrix 中的左下角元素為標志數 flag &#xff0c;則有: 若 flag > target &#xff0c;則 target 一定在 flag 所在行的上方 &#xff0c;即 flag 所在行可被消去&#xff0c…

kotlin安卓開發教程視頻,2024年Android開發陷入飽和

Android基礎 1、什么是ANR 如何避免它&#xff1f; 如果耗時操作需要讓用戶等待&#xff0c;那么可以在界面上顯示進度條。 2、View的繪制流程&#xff1b;自定義View如何考慮機型適配&#xff1b;自定義View的事件 3、分發機制&#xff1b;View和ViewGroup分別有哪些事件分…

Java協議解析:探索網絡編程的核心

引言 在當今數字化時代&#xff0c;網絡編程扮演著日益重要的角色&#xff0c;而Java協議則成為這個領域中不可或缺的一部分。隨著互聯網的普及和各種網絡應用的不斷涌現&#xff0c;對網絡通信的要求也變得越來越嚴格&#xff0c;這就需要對Java協議進行深入的理解和探索。本…

【知識管理】計算全局效率 Network global efficiency

這句話提到的“全局效率”&#xff08;global efficiency&#xff09;是網絡中信息傳遞效率的一個衡量指標&#xff0c;它是網絡中最短路徑長度的倒數的平均值。為了更好地理解這個概念&#xff0c;讓我們分解這個定義&#xff1a; 最短路徑長度&#xff08;Shortest Path Len…

輸出數據庫全部表的外鍵引用拓撲結構

執行 sql&#xff1a; SELECTconstraint_name,table_name,column_name,referenced_table_name,referenced_column_name FROMinformation_schema.key_column_usage WHEREtable_schema ${databaseName} ANDreferenced_table_name IS NOT NULL 將執行結果復制到臨時文件中&#…