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

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

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

實際返回結(jié)果:

三、@DateTimeFormat注解
- 提供者:Spring
- 作用:可對java.util.Date、java.uitl.calendar、java.long.Long及Joda時間類型的屬性進行標(biāo)注,主要處理前端時間類型與后端pojo對象中的成員變量進行數(shù)據(jù)綁定,所約束的時間格式并不會影響后端返回前端的時間類型數(shù)據(jù)格式;
- 注意(注意!注意!注意!講三遍):前端入?yún)?shù)據(jù)的時間格式必須與注解中定義的時間格式相同,不然會報錯,如:@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)換的;
- 如果單獨使用
@DateTimeFormat時,響應(yīng)給前端的時間會比實際時間晚8個小時(時區(qū)原因)。 - 針對
@DateTimeFormat做了補充說明,有場景示例比較詳情,需要的大佬可以看一下。傳送門:Spring @DateTimeFormat日期格式化時注解淺析分享
到此這篇關(guān)于@JsonFormat 和 @DateTimeFormat 時間格式化注解的文章就介紹到這了,更多相關(guān)@JsonFormat 和 @DateTimeFormat 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringMVC中的DispatcherServlet結(jié)構(gòu)和初始化詳解
這篇文章主要介紹了SpringMVC中的DispatcherServlet結(jié)構(gòu)和初始化詳解,SpringMVC中Spring容器的關(guān)系是通過監(jiān)聽方式啟動的,那么Spring與Servlet的Web容器(如:Tomcat、jetty)的關(guān)系則是通過DispatcherServlet進行關(guān)聯(lián),需要的朋友可以參考下2024-01-01
Java8新特性之重復(fù)注解(repeating annotations)淺析
這篇文章主要介紹了Java8新特性之重復(fù)注解(repeating annotations)淺析,這個新特性只是修改了程序的可讀性,是比較小的一個改動,需要的朋友可以參考下2014-06-06
Java通過 Socket 實現(xiàn) TCP服務(wù)端
這篇文章主要介紹了Java通過 Socket 實現(xiàn) TCP服務(wù)端的相關(guān)資料,需要的朋友可以參考下2017-05-05
詳解Java使用Pipeline對Redis批量讀寫(hmset&hgetall)
本篇文章主要介紹了Java使用Pipeline對Redis批量讀寫(hmset&hgetall),具有一定的參考價值,有興趣的可以了解一下。2016-12-12
mybatisPlus條件構(gòu)造器常用方法小結(jié)
這篇文章主要介紹了mybatisPlus條件構(gòu)造器常用方法,首先是.select和其他條件,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-10-10

