keycloak~時間不正確的問題

張佔嶺發表於2023-04-12

首先我們應該知道,寫到資料庫裡的時間,主要和你的mysql時區system_time_zone有關,而把mysql裡的資料取出來,以json形式響應到瀏覽器上,這個時間會經過反序列化的過程,這時時間和註解@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")有關。

和我們相關的幾個時區

  • UTC: Coordinated Universal Time, 國際協調時間,也稱世界標準時間。
  • GMT:Greenwich Mean Time, 格林尼治時間
  • CST:中國標準時間(China Standard Time),為GMT+8
  • BST:英國夏令時間,為GMT+1
  • CST:美國中部時間(Central Standard Time),為GMT-6,正常比北京慢14小時,夏令時慢13小時
  • 東八區:GMT+8

資料庫時區

1、首先檢視MySQL當前的時間

select curtime();
show variables like "%time_zone%";

time_zone說明mysql使用system的時區,system_time_zone說明system使用CST時區

2、進行修改

set global time_zone = '+8:00'; #修改mysql全域性時區為北京時間,也就是我們所在的東8區
set time_zone = '+8:00'; #修改當前會話時區
flush privileges;

直接在資料庫連線串上新增時區

serverTimezone=GMT%2B8 #表示東八區

為程式碼新增物件的時區註解

@Column(name = "EXPIRE_DATE")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date expireDate;

修改k8s中pod的時區

...
  containers:
  - name: xxx
    env: 
      - name: TZ
        value: Asia/Shanghai
...
    volumeMounts:
      - name: timezone
        mountPath: /etc/localtime
  volumes:
    - name: timezone
      hostPath:
        path: /usr/share/zoneinfo/Asia/Shanghai

總結

事實上,資料庫裡的時間與顯示出現的時間不一致,與pod的時間沒關係,主要還是看你的資料庫時區與@JsonFormat註解的時區。

  • 如果@JsonFormat如果是GMT+8,而連線串裡是GMT+0,會出現下面截圖

  • 如果@JsonFormat如果是GMT+8,連線串裡也是GMT+8,會出現我們想要的截圖

  • 最後,如果@JsonFormat如果是GMT+8,連線串裡也是CST(可能被認為是美國中部時間,GMT-6),那麼它將會比北京時間慢8+6小時

相關文章