@JsonFormat?和?@DateTimeFormat?時(shí)間格式化注解(場(chǎng)景示例代碼)
前后數(shù)據(jù)交互過(guò)程中,Date類型的數(shù)據(jù)經(jīng)常會(huì)出現(xiàn)類型映射轉(zhuǎn)換的錯(cuò)誤,為了達(dá)到業(yè)務(wù)的目標(biāo)時(shí)間格式,通常會(huì)使用@JsonFormat 和 @DateTimeFormat,但是這兩者有什么區(qū)別呢?
本文的衍生篇已發(fā)布,感興趣的伙伴們可以瞅瞅哈,針對(duì)
@DateTimeFormat
做了補(bǔ)充說(shuō)明,有場(chǎng)景示例比較詳情,需要的大佬可以看一下。傳送門: Spring @DateTimeFormat日期格式化時(shí)注解淺析分享
一、示例代碼
先準(zhǔn)備一個(gè)簡(jiǎn)單POJO,擁有Date類型的成員變量:
@Data public class DateEntity { private Date date; }
lombok依賴(版本任意):
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> </dependency>
再準(zhǔn)備一個(gè)Controller,模擬一下前后交互:
@RestController @RequestMapping("/date") public class DateController { @RequestMapping("/test") public DateEntity getDate(DateEntity dateEntity){ System.out.println("入?yún)⒌膁ate:"+dateEntity.getDate()); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String date = sdf.format(dateEntity.getDate()); System.out.println("SimpleDateFormat格式化后的date:"+date); DateEntity result = new DateEntity(); result.setDate(new Date()); return result; } }
創(chuàng)建好POJO和Controller后,用Postman模擬一下請(qǐng)求發(fā)送:
結(jié)果報(bào)錯(cuò):
大概意思就是說(shuō)String類型轉(zhuǎn)換成Date類型失敗,所以報(bào)了IllegalArgumentException異常;
二、@JsonFormat注解
- 提供者:jackson
- 作用:可以約束時(shí)間的接收格式和響應(yīng)格式 (接收和響應(yīng)的都是JSON字符串),將日期類型數(shù)據(jù)在JSON格式和java.util.Date對(duì)象之間轉(zhuǎn)換。與傳輸方向沒(méi)有關(guān)系(前端到后端or后端到前端都可以使用),注意因?yàn)槲覀兪菛|八區(qū)(北京時(shí)間),使用時(shí)需要加上時(shí)區(qū)( timezone = “GMT+8”),不然所得值會(huì)比實(shí)際時(shí)間晚8小時(shí);
- 常用注解屬性:
名稱 | 作用 |
---|---|
pattern | 約定時(shí)間格式:pattern=“yyyy-MM-dd HH:mm:ss” |
timezone | 指定具體時(shí)區(qū): timezone = “GMT+8” or timezone = “Asia/Shanghai” |
- 經(jīng)過(guò)測(cè)試使用單獨(dú)使用@JsonFormat注解時(shí)需要先通過(guò)@RequestBody將入?yún)?shù)映射到實(shí)體后,@JsonFormat注解才能去對(duì)時(shí)間格式進(jìn)行約束;
- 改造controller,加上了@RequestBody注解:
@RequestMapping("/test") public DateEntity getDate(@RequestBody DateEntity dateEntity){ System.out.println("入?yún)⒌膁ate:"+dateEntity.getDate()); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String date = sdf.format(dateEntity.getDate()); System.out.println("SimpleDateFormat格式化后的date:"+date); DateEntity result = new DateEntity(); result.setDate(new Date()); return result; }
POJO類中也加上了@JsonFormat注解:
@Data public class DateEntity { @JsonFormat(pattern = "yyyy-MM-dd hh", timezone = "GMT+8") private Date date; }
測(cè)試:
結(jié)果可以看出,@JsonFormat對(duì)時(shí)間格式進(jìn)行了約束 ,mm:ss并沒(méi)有按傳入的值顯示:
再看return的返回值中也可以看出輸出格式是完全按照@JsonFormat約定的時(shí)間格式(“yyyy-MM-dd hh”)進(jìn)行了輸出;
實(shí)際返回結(jié)果:
三、@DateTimeFormat注解
- 提供者:Spring
- 作用:可對(duì)java.util.Date、java.uitl.calendar、java.long.Long及Joda時(shí)間類型的屬性進(jìn)行標(biāo)注,主要處理前端時(shí)間類型與后端pojo對(duì)象中的成員變量進(jìn)行數(shù)據(jù)綁定,所約束的時(shí)間格式并不會(huì)影響后端返回前端的時(shí)間類型數(shù)據(jù)格式;
- 注意(注意!注意!注意!講三遍):前端入?yún)?shù)據(jù)的時(shí)間格式必須與注解中定義的時(shí)間格式相同,不然會(huì)報(bào)錯(cuò),如:@DateTimeFormat(pattern = “yyyy-MM-dd HH:mm”) 則入?yún)⒌母袷奖仨殲?quot;2020-6-4 10:43";
- 常用注解屬性:
名稱 | 作用 |
---|---|
iso | 類型為DateTimeFormat.ISO,常用值: DateTimeFormat.ISO.DATE:格式為yyyy-MM-dd DateTimeFormat.ISO.DATE_TIME:格式為yyyy-MM-dd hh:mm:ss.SSSZ DateTimeFormat.ISO.TIME:格式為hh:mm:ss.SSSZ DateTimeFormat.ISO.NONE:表示不使用ISO格式的時(shí)間(默認(rèn)值) |
pattern | 類型為String,使用自定義時(shí)間格式化字符串,如"yyyy-MM-dd hh:mm:ss" |
style | 類型為String,通過(guò)樣式指定日期時(shí)間的格式,由兩位字符組成, 第一位表示日期的樣式,第二位表示時(shí)間的格式,以下是幾個(gè)常用的可選值: S:短日期/時(shí)間的樣式 M:中日期/時(shí)間的樣式 L:短日期/時(shí)間的樣式 F:完整日期/時(shí)間的樣子 -:忽略日期或時(shí)間的樣式 默認(rèn)值 style=“SS” |
controller代碼:
@RequestMapping("/test") public DateEntity getDate(DateEntity dateEntity){ System.out.println("入?yún)⒌膁ate:"+dateEntity.getDate()); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String date = sdf.format(dateEntity.getDate()); System.out.println("SimpleDateFormat格式化后的date:"+date); DateEntity result = new DateEntity(); Date date1 = new Date(); result.setDate(date1); return result; }
POJO代碼:
@Data public class DateEntity { @DateTimeFormat(pattern = "yyyy-MM-dd hh") private Date date; }
測(cè)試:
結(jié)果:
五、總結(jié)@JsonFormat 和 @DateTimeFormat 區(qū)別
@JsonFormat
既可以約束前端傳入的時(shí)間類型參數(shù)格式,也可以約束后端響應(yīng)前端的時(shí)間類型格式;@DateTimeFormat
:- 只能約束前端入?yún)r(shí)間類型的格式,并不會(huì)修改原有的日期對(duì)象的格式,如果想要獲得期望的日期格式,是需要自己手動(dòng)轉(zhuǎn)換的;
- 如果單獨(dú)使用
@DateTimeFormat
時(shí),響應(yīng)給前端的時(shí)間會(huì)比實(shí)際時(shí)間晚8個(gè)小時(shí)(時(shí)區(qū)原因)。 - 針對(duì)
@DateTimeFormat
做了補(bǔ)充說(shuō)明,有場(chǎng)景示例比較詳情,需要的大佬可以看一下。傳送門:Spring @DateTimeFormat日期格式化時(shí)注解淺析分享
到此這篇關(guān)于@JsonFormat 和 @DateTimeFormat 時(shí)間格式化注解的文章就介紹到這了,更多相關(guān)@JsonFormat 和 @DateTimeFormat 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringMVC中的DispatcherServlet結(jié)構(gòu)和初始化詳解
這篇文章主要介紹了SpringMVC中的DispatcherServlet結(jié)構(gòu)和初始化詳解,SpringMVC中Spring容器的關(guān)系是通過(guò)監(jiān)聽(tīng)方式啟動(dòng)的,那么Spring與Servlet的Web容器(如:Tomcat、jetty)的關(guān)系則是通過(guò)DispatcherServlet進(jìn)行關(guān)聯(lián),需要的朋友可以參考下2024-01-01Java8新特性之重復(fù)注解(repeating annotations)淺析
這篇文章主要介紹了Java8新特性之重復(fù)注解(repeating annotations)淺析,這個(gè)新特性只是修改了程序的可讀性,是比較小的一個(gè)改動(dòng),需要的朋友可以參考下2014-06-06Java通過(guò) Socket 實(shí)現(xiàn) TCP服務(wù)端
這篇文章主要介紹了Java通過(guò) Socket 實(shí)現(xiàn) TCP服務(wù)端的相關(guān)資料,需要的朋友可以參考下2017-05-05Spring中的StopWatch記錄操作時(shí)間代碼實(shí)例
這篇文章主要介紹了Spring中的StopWatch記錄操作時(shí)間代碼實(shí)例,spring-framework提供的一個(gè)StopWatch類可以做類似任務(wù)執(zhí)行時(shí)間控制,也就是封裝了一個(gè)對(duì)開始時(shí)間,結(jié)束時(shí)間記錄操作的Java類,需要的朋友可以參考下2023-11-11詳解Java使用Pipeline對(duì)Redis批量讀寫(hmset&hgetall)
本篇文章主要介紹了Java使用Pipeline對(duì)Redis批量讀寫(hmset&hgetall),具有一定的參考價(jià)值,有興趣的可以了解一下。2016-12-12mybatisPlus條件構(gòu)造器常用方法小結(jié)
這篇文章主要介紹了mybatisPlus條件構(gòu)造器常用方法,首先是.select和其他條件,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-10-10