java中@DateTimeFormat和@JsonFormat注解的使用
1. 準(zhǔn)備
定義一個pojo,它有一個 java.util.Date 類型的屬性 date。
import java.util.Date;
public class DateVo {
private Date date;
public void setDate(Date date){
this.date = date;
}
public Date getDate(){
return date;
}
}
定義一個Controller
@RestController
@RequestMapping("/date/")
public class DateController {
@RequestMapping("test")
public DateVo getDate(DateVo vo){
System.out.println("date1:"+vo.getDate());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date = sdf.format(vo.getDate());
System.out.println("date2:"+date);
DateVo vo2 = new DateVo();
vo2.setDate(new Date());
return vo2;
}
}訪問 /date/test ,并傳入?yún)?shù):2018-08-02 22:05:55
發(fā)現(xiàn)并不能訪問成功,會拋出異常:

因為傳入的參數(shù)是 String 類型的,而用來接收參數(shù)的 DateVo 的 date 屬性是 java.util.Date 類型的,類型無法轉(zhuǎn)換。
2. 入?yún)⒏袷交?/h2>
這時,就可以使用 Spring 的 @DateTimeFormat 注解格式化參數(shù),來解決上述問題。
改造 DateVo:
public class DateVo {
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date date;
public void setDate(Date date){
this.date = date;
}
public Date getDate(){
return date;
}
}
再像上面一樣訪問 /date/test ,并傳入?yún)?shù):2018-08-02 22:05:55,將在控制臺上打印:
date1:Thu Aug 02 22:05:55 CST 2018
date2:2018-08-02 22:05:55
可以看到,加入 @DateTimeFormat 注解后參數(shù)可以被接收到了,但日期時間的格式還是需要自己再手動轉(zhuǎn)換一下。
因為 @DateTimeFormat 注解的 pattern 屬性值指定的日期時間格式并不是將要轉(zhuǎn)換成的日期格式,這個指定的格式是和傳入的參數(shù)對應(yīng)的,假如注解為:
@DateTimeFormat(pattern="yyyy/MM/dd HH:mm:ss")
則傳入的參數(shù)應(yīng)該是這樣的:
2018/08/02 22:05:55
否則會拋出異常。
3. 出參格式化
在上述示例中,調(diào)用接口的返回結(jié)果為:
"date": "2018-08-01T14:25:31.296+0000"
這個格式并不是我們想要的,那么如何將其進行格式化?這時就需要用到 jackson 的 @JsonFormat 注解。
改造 DateVo:
public class DateVo {
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
@JsonFormat(
pattern = "yyyy-MM-dd HH:mm:ss"
)
private Date date;
public void setDate(Date date){
this.date = date;
}
public Date getDate(){
return date;
}
}
繼續(xù)訪問 /date/test ,并傳入?yún)?shù):2018-08-02 22:05:55,可以看到接口返回的結(jié)果為:
"date": "2018-08-01 14:32:57"
雖然時間格式正確了,但實際上當(dāng)前時間是 “2018-08-01 22:32:57” ,早了8個小時。因為,jackson在序列化時間時是按照國際標(biāo)準(zhǔn)時間GMT進行格式化的,而在國內(nèi)默認時區(qū)使用的是CST時區(qū),兩者相差8小時。
所以,@JsonFormat 注解還要再加一個屬性:
@JsonFormat(
pattern = "yyyy-MM-dd HH:mm:ss",
timezone = "GMT+8"
)
private Date date;
這樣,結(jié)果就正確了。
因為 @JsonFormat 注解不是 Spring 自帶的注解,所以使用該注解前需要添加 jackson 相關(guān)的依賴包。當(dāng)然,如果是 SpringBoot 項目就不需要自己手動添加依賴了,因為在 spring-boot-start-web 下已經(jīng)包含了 jackson 相關(guān)依賴。

到此這篇關(guān)于java中@DateTimeFormat和@JsonFormat注解的使用的文章就介紹到這了,更多相關(guān)@DateTimeFormat和@JsonFormat注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot2.0 整合 Dubbo框架實現(xiàn)RPC服務(wù)遠程調(diào)用方法
這篇文章主要介紹了SpringBoot2.0 整合 Dubbo框架 實現(xiàn)RPC服務(wù)遠程調(diào)用 ,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-07-07
Spring如何實現(xiàn)輸出帶動態(tài)標(biāo)簽的日志
文章介紹了如何通過動態(tài)標(biāo)簽日志實現(xiàn),解決了部分業(yè)務(wù)代碼在多個模塊中調(diào)用時日志無法直觀看出來源的問題,主要通過ThreadLocal存儲業(yè)務(wù)標(biāo)簽,并在日志輸出時插入該標(biāo)簽,實現(xiàn)日志的動態(tài)標(biāo)簽功能,感興趣的朋友一起看看吧2024-12-12
java 實現(xiàn)websocket的兩種方式實例詳解
這篇文章主要介紹了java 實現(xiàn)websocket的兩種方式實例詳解,一種使用tomcat的websocket實現(xiàn),一種使用spring的websocket,本文通過代碼給大家介紹的非常詳細,需要的朋友可以參考下2018-07-07
java 用redisTemplate 的 Operations存取list集合操作
這篇文章主要介紹了java 用redisTemplate 的 Operations存取list集合操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
MyBatis在insert插入操作時返回主鍵ID的配置(推薦)
這篇文章主要介紹了MyBatis在insert插入操作時返回主鍵ID的配置的相關(guān)資料,需要的朋友可以參考下2017-10-10

