Jackson日期轉換少一天


 

1. 案例

添加一個學生,前端把生日傳給后端,后端使用Datel類型接收到后,然后調用其它服務進行保存入庫。

與其它服務交互時,使用的是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"}

 

2. 原因

兩個關鍵點:1.birthday輸出帶有CDT;2、日期是1990-06-01

CDT: 夏令時標志(一般在天亮早的夏季人為將時間調快一小時)

1986年至1991年,中華人民共和國在全國范圍實行了六年夏令時(具體請咨詢百度)

 

3. 解決方案

1. 統一使用字符串交互,在開發中僅在Entity(與數據庫表對應的)中出現Date,其它場景統一使用String -- 推薦

2.Jackson 換成 Fastjson

3. 添加JVM參數-Duser.timezone=GMT+8(網上說的,我們項目使用k8s部署,試了沒啥用) -- 不推薦

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM