@JsonFormat?和?@DateTimeFormat?時間格式化注解(場景示例代碼)
前后數(shù)據(jù)交互過程中,Date類型的數(shù)據(jù)經(jīng)常會出現(xiàn)類型映射轉(zhuǎn)換的錯誤,為了達(dá)到業(yè)務(wù)的目標(biāo)時間格式,通常會使用@JsonFormat 和 @DateTimeFormat,但是這兩者有什么區(qū)別呢?
本文的衍生篇已發(fā)布,感興趣的伙伴們可以瞅瞅哈,針對
@DateTimeFormat做了補(bǔ)充說明,有場景示例比較詳情,需要的大佬可以看一下。傳送門: Spring @DateTimeFormat日期格式化時注解淺析分享
一、示例代碼
先準(zhǔ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)備一個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模擬一下請求發(fā)送:

結(jié)果報(bào)錯:

大概意思就是說String類型轉(zhuǎn)換成Date類型失敗,所以報(bào)了IllegalArgumentException異常;
二、@JsonFormat注解
- 提供者:jackson
- 作用:可以約束時間的接收格式和響應(yīng)格式 (接收和響應(yīng)的都是JSON字符串),將日期類型數(shù)據(jù)在JSON格式和java.util.Date對象之間轉(zhuǎn)換。與傳輸方向沒有關(guān)系(前端到后端or后端到前端都可以使用),注意因?yàn)槲覀兪菛|八區(qū)(北京時間),使用時需要加上時區(qū)( timezone = “GMT+8”),不然所得值會比實(shí)際時間晚8小時;
- 常用注解屬性:
| 名稱 | 作用 |
|---|---|
| pattern | 約定時間格式:pattern=“yyyy-MM-dd HH:mm:ss” |
| timezone | 指定具體時區(qū): timezone = “GMT+8” or timezone = “Asia/Shanghai” |
- 經(jīng)過測試使用單獨(dú)使用@JsonFormat注解時需要先通過@RequestBody將入?yún)?shù)映射到實(shí)體后,@JsonFormat注解才能去對時間格式進(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;
}測試:

結(jié)果可以看出,@JsonFormat對時間格式進(jìn)行了約束 ,mm:ss并沒有按傳入的值顯示:

再看return的返回值中也可以看出輸出格式是完全按照@JsonFormat約定的時間格式(“yyyy-MM-dd hh”)進(jìn)行了輸出;

實(shí)際返回結(jié)果:

三、@DateTimeFormat注解
- 提供者:Spring
- 作用:可對java.util.Date、java.uitl.calendar、java.long.Long及Joda時間類型的屬性進(jìn)行標(biāo)注,主要處理前端時間類型與后端pojo對象中的成員變量進(jìn)行數(shù)據(jù)綁定,所約束的時間格式并不會影響后端返回前端的時間類型數(shù)據(jù)格式;
- 注意(注意!注意!注意!講三遍):前端入?yún)?shù)據(jù)的時間格式必須與注解中定義的時間格式相同,不然會報(bào)錯,如:@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格式的時間(默認(rèn)值) |
| pattern | 類型為String,使用自定義時間格式化字符串,如"yyyy-MM-dd hh:mm:ss" |
| style | 類型為String,通過樣式指定日期時間的格式,由兩位字符組成, 第一位表示日期的樣式,第二位表示時間的格式,以下是幾個常用的可選值: S:短日期/時間的樣式 M:中日期/時間的樣式 L:短日期/時間的樣式 F:完整日期/時間的樣子 -:忽略日期或時間的樣式 默認(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;
}測試:

結(jié)果:

五、總結(jié)@JsonFormat 和 @DateTimeFormat 區(qū)別
@JsonFormat既可以約束前端傳入的時間類型參數(shù)格式,也可以約束后端響應(yīng)前端的時間類型格式;@DateTimeFormat:- 只能約束前端入?yún)r間類型的格式,并不會修改原有的日期對象的格式,如果想要獲得期望的日期格式,是需要自己手動轉(zhuǎn)換的;
- 如果單獨(dú)使用
@DateTimeFormat時,響應(yīng)給前端的時間會比實(shí)際時間晚8個小時(時區(qū)原因)。 - 針對
@DateTimeFormat做了補(bǔ)充說明,有場景示例比較詳情,需要的大佬可以看一下。傳送門:Spring @DateTimeFormat日期格式化時注解淺析分享
到此這篇關(guān)于@JsonFormat 和 @DateTimeFormat 時間格式化注解的文章就介紹到這了,更多相關(guān)@JsonFormat 和 @DateTimeFormat 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java基礎(chǔ)之Comparable與Comparator概述
這篇文章主要介紹了Java基礎(chǔ)之Comparable與Comparator詳解,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04
專屬于程序員的浪漫-Java輸出動態(tài)閃圖iloveyou
這篇文章主要介紹了專屬于程序員的浪漫-Java輸出動態(tài)閃圖iloveyou,具有一定參考價值,需要的朋友可以了解下。2017-11-11
Java人機(jī)猜拳實(shí)現(xiàn)的思路及方法實(shí)例
這篇文章主要給大家介紹了關(guān)于Java人機(jī)猜拳實(shí)現(xiàn)的思路及方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
Spring復(fù)雜對象創(chuàng)建的方式小結(jié)
這篇文章主要介紹了Spring復(fù)雜對象創(chuàng)建的三種方式,現(xiàn)在使用Spring如何創(chuàng)建這種類型的對象?Spring中提供了三種方法來創(chuàng)建復(fù)雜對象,需要的朋友可以參考下2022-01-01

