首先我們應該知道,寫到資料庫裡的時間,主要和你的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小時