項(xiàng)目中遇到一個(gè)問題匀哄,一個(gè)格式為dd/MM/yyyy的時(shí)間傳到前端后秦效,日期中的day總比數(shù)據(jù)庫中保存的天數(shù)少一天,即‘10/08/2018’傳過去變成了'09/08/2018'拱雏,本地(北京)怎么測(cè)都沒問題棉安,但到線上(奧克蘭)后,對(duì)于添加的日期铸抑,天數(shù)總要比添加值少一天贡耽。
后來想到可能是因?yàn)闀r(shí)差的問題,就把系統(tǒng)的時(shí)區(qū)改為奧克蘭的鹊汛,結(jié)果問題100%復(fù)現(xiàn)F崖浮!刁憋!
網(wǎng)上搜了一下滥嘴,有說使用@JsonFormat(pattern="dd/MM/yyyy", timezone="GMT+12")
注解去標(biāo)注相應(yīng)的日期字段,然后在前端(vue.js項(xiàng)目)使用element-ui展示時(shí)至耻,對(duì)日期選擇框el-date-picker設(shè)置value-format屬性(數(shù)據(jù)回傳的日期格式)若皱,同時(shí)format屬性設(shè)置頁面顯示的日期格式。
@JsonFormat(pattern="dd/MM/yyyy", timezone="GMT+12")
private Date checkOutDate;
這樣試了一下尘颓,有效果走触,但因?yàn)槊總€(gè)日期字段使用方式不一樣,導(dǎo)致其他的字段顯示不出來疤苹,后來看到一篇文章 Java 日期 解析減少一天問題互广。神奇,按照里面的方法卧土,即對(duì)PO類中時(shí)間字段的get方法里惫皱,添加一句代碼:
private Date checkOutDate;
public Date getCheckOutDate() {
TimeZone.setDefault(TimeZone.getTimeZone("GMT+12"));
return checkOutDate;
}
使用這種方法,可以完美解決這個(gè)問題尤莺!
原因:
時(shí)差問題(夏令時(shí))
timestamp與datetime區(qū)別:
timeType | Storage | format | timezoneTransfer |
---|---|---|---|
timestamp | 4 byte | UTC格式保存 | 存儲(chǔ)時(shí)對(duì)當(dāng)前的時(shí)區(qū)進(jìn)行轉(zhuǎn)換旅敷,檢索時(shí)再轉(zhuǎn)換回當(dāng)前時(shí)區(qū) |
datetime | 8 byte | 實(shí)際格式保存 | 與時(shí)區(qū)無關(guān) |