keycloak~時(shí)間不正確的問題
首先我們應(yīng)該知道,寫到數(shù)據(jù)庫(kù)里的時(shí)間,主要和你的mysql時(shí)區(qū)system_time_zone
有關(guān),而把mysql里的數(shù)據(jù)取出來,以json形式響應(yīng)到瀏覽器上,這個(gè)時(shí)間會(huì)經(jīng)過反序列化的過程,這時(shí)時(shí)間和注解@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
有關(guān)。
和我們相關(guān)的幾個(gè)時(shí)區(qū)
UTC: Coordinated Universal Time, 國(guó)際協(xié)調(diào)時(shí)間,也稱世界標(biāo)準(zhǔn)時(shí)間。
GMT:Greenwich Mean Time, 格林尼治時(shí)間
CST:中國(guó)標(biāo)準(zhǔn)時(shí)間(China Standard Time),為GMT+8
BST:英國(guó)夏令時(shí)間,為GMT+1
CST:美國(guó)中部時(shí)間(Central Standard Time),為GMT-6,正常比北京慢14小時(shí),夏令時(shí)慢13小時(shí)
東八區(qū):GMT+8
數(shù)據(jù)庫(kù)時(shí)區(qū)
1、首先查看MySQL當(dāng)前的時(shí)間
select curtime();
show variables like "%time_zone%";
time_zone說明mysql使用system的時(shí)區(qū),system_time_zone說明system使用CST時(shí)區(qū)
2、進(jìn)行修改
set global time_zone = '+8:00'; #修改mysql全局時(shí)區(qū)為北京時(shí)間,也就是我們所在的東8區(qū)
set time_zone = '+8:00'; #修改當(dāng)前會(huì)話時(shí)區(qū)
flush privileges;
直接在數(shù)據(jù)庫(kù)連接串上添加時(shí)區(qū)
serverTimezone=GMT%2B8 #表示東八區(qū)
為代碼添加對(duì)象的時(shí)區(qū)注解
@Column(name = "EXPIRE_DATE")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date expireDate;
修改k8s中pod的時(shí)區(qū)
...
?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
總結(jié)
事實(shí)上,數(shù)據(jù)庫(kù)里的時(shí)間與顯示出現(xiàn)的時(shí)間不一致,與pod的時(shí)間沒關(guān)系,主要還是看你的數(shù)據(jù)庫(kù)時(shí)區(qū)與@JsonFormat注解的時(shí)區(qū)。
如果@JsonFormat如果是GMT+8,而連接串里是GMT+0,會(huì)出現(xiàn)下面截圖


如果@JsonFormat如果是GMT+8,連接串里也是GMT+8,會(huì)出現(xiàn)我們想要的截圖


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

