1. 案例前端
添加一個學生,前端把生日傳給後端,後端使用Datel類型接收到後,而後調用其它服務進行保存入庫。數據庫
與其它服務交互時,使用的是JSON格式,出現日期少一天。json
@Data @AllArgsConstructor public class Student { @JsonFormat(pattern = "yyyy-MM-dd") private Date birthday; }
@Test public void test1() throws Exception { // String 轉 Date String date = "1990-06-01"; Date birthday = DateUtils.parseDateStrictly(date, "yyyy-MM-dd"); System.out.println("birthday:" + birthday); // 建立對象 Student student = new Student(birthday); ObjectMapper mapper = new ObjectMapper(); // 對象轉JSON串 System.out.println("student:" + mapper.writeValueAsString(student)); }
控制檯輸出結果:後端
birthday:Fri Jun 01 00:00:00 CDT 1990
student:{"birthday":"1990-05-31"}app
2. 緣由spa
兩個關鍵點:1.birthday輸出帶有CDT;二、日期是1990-06-01code
CDT: 夏令時標誌(通常在天亮早的夏季人爲將時間調快一小時)orm
1986年至1991年,中華人民共和國在全國範圍實行了六年夏令時(具體請諮詢百度)對象
3. 解決方案blog
1. 統一使用字符串交互,在開發中僅在Entity(與數據庫表對應的)中出現Date,其它場景統一使用String -- 推薦
2.Jackson 換成 Fastjson
3. 添加JVM參數-Duser.timezone=GMT+8(網上說的,咱們項目使用k8s部署,試了沒啥用) -- 不推薦