keycloak~時(shi)間(jian)不正確(que)的問題(ti)
首先我們應該知道,寫到數據庫里的時間,主要和你的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、首先查看(kan)MySQL當前的(de)時間(jian)
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
總結
事實上,數據庫里的(de)時(shi)間與(yu)顯示出(chu)現的(de)時(shi)間不一致,與(yu)pod的(de)時(shi)間沒關(guan)系(xi),主要還是(shi)看(kan)你(ni)的(de)數據庫時(shi)區與(yu)@JsonFormat注解的(de)時(shi)區。
- 如果@JsonFormat如果是GMT+8,而連接串里是GMT+0,會出現下面截圖


- 如果@JsonFormat如果是GMT+8,連接串里也是GMT+8,會出現我們想要的截圖


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


