記錄一下項目中遇到的詭異的問題:
今天有用戶反映web系統中,某些人口數據的生日更新之后一直退一天,比如說生日是1987-05-04,編輯保存之后顯示1987-05-03,之前也有遇到類似的問題,是時區問題造成的,在加上@JsonFormat(pattern = "yyyy-MM-dd",timezone="GMT+8")之后就可以了。這次的問題就有點詭異了,因為試了其他數據,基本上都不會出現這個問題。沒辦法只能用排除法了,首先將出現問題的人員生日改成上面保存成功的生日數據:2000-05-01,保存之后發現不會出現退一天的情況,此時排除特定人員數據問題,考慮特定日期問題,通過測試發現,區間在1987-1991的年份日期保存后都會出現退一天的問題(此處有誤,測試時剛好選的都是5-8月的日期),將這特定年份上百度查了之后,終於發現原因,夏令時!
這樣的話問題就明了了,在實行夏時制期間出生者,其實際出生時間應為當時的出生時間須減去1小時,比方說夏令時公歷1991年5月2日0點10分出生,轉換為北京時間為1991年5月1日23點10出生。@JsonFormat包含了處理夏令時的問題。
那這問題要怎么解決呢?百度有人說在get方法中添加
TimeZone.setDefault(TimeZone.getTimeZone("GMT+08"));
可以解決,我嘗試了下,果然可以。最后把這段移到項目自定義的ObjectMapper中: