如何解決springboot數據庫查詢時出現的時區差異問題

springboot數據庫查詢時出現的時區差異

最近項目中使用到多數據源將MySQL庫中的數據遷移到mongo庫中,發現取出後的數據與原數據時間上會出現8小時的相差,

最後度娘後終於解決問題,記錄一下:

網上看到瞭兩種比較實用的方法,因為使用的springboot原因,所以我這裡使用的是在配置文件application.yml中進行修改,另外其他方法網上都可以搜到,

1.在連接數據庫的配置上我們添加一項

&serverTimezone=GMT%2b8
 primary:
      jdbc-url: jdbc:mysql://******:3306/***?useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2b8
      username: ****
      password: *****
    secondary:
      jdbc-url: jdbc:mysql://*******:3306/***?useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2b8
      username: *****
      password: ********

原格式應該是這樣的:

&serverTimezone=GMT+8 這裡使用%2b替換 + 號

2.直接在boot配置文件中增加jackson配置

#在application.yml中增加配置
spring:
    jackson:
        time-zone: GMT+8

這樣就可以成功將時間修改成功瞭,還有其他方法,大傢可以查閱哦

springboot new Date()時區差8小時

1 在k8s環境中,在代碼中比較時間。new Date() 下相差8小時

檢查宿主機 時區是 cst時區

用java代碼寫出controller時區發現是GMT

代碼如下:

Calendar calendar = Calendar.getInstance();      
        System.out.println("目前時間:" + calendar.getTime());
        System.out.println("Calendar時區::" + calendar.getTimeZone().getID());
        System.out.println("user.timezone:" + System.getProperty("user.timezone"));
        System.out.println("user.country:" + System.getProperty("user.country"));
        System.out.println("默認時區:" + TimeZone.getDefault().getID());

輸出時區是 GMT 跟宿主機還不一樣,搞不定運維,自己搞把

看來還是時區搞的鬼-

1、數據庫鏈接db添加參數 serverTimezone=Asia/Shanghai

2、springboot啟動腳本添加 -Duser.timezone=GMT+08

3、jackson 全局配置

spring.jackson.date-format: yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone: GMT+8

4、jackson 註解

@JsonFormat(timezone = “GMT+8”, pattern = “yyyy-MM-dd HH:mm:ss”)

總結

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: