keycloak~時間不正確的問題
首先我們應該知道,寫到數據庫里的時間,主要和你的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小時


浙公網安備 33010602011771號