最近倒騰了一台阿里雲主機,打算在上面裝點自己的應用。使用docker安裝了安裝mysql后,發現數據庫的存儲的時間與java-web應用的時間差8個小時,初步懷疑是docker容器時區的問題。經過一系列研究,總算把docker容器的時區給調整過來。滿懷欣喜的以為問題得到了解決,再次運行應用,我發現時間竟然相差了13個小時。為了徹底解決問題,決定深入研究一下,皇天不負有心人,總算了解其中緣由,問題也終於解決。下面我還原一下問題過程。
初始安裝
初始從mysql鏡像安裝,沒有調整任何東西時,通過下面語句可以看出,mysql默認使用系統時區,docker系統的默認時區是UTC,與北京時間剛好相差8小時。
show variables like "%time_zone%";
select now();
容器時區調整
調整docker容器時區后(詳細過程見:解決Docker容器時區不一致的問題),執行SQL語句,我們可以看到mysql的時區為CST。
我們的問題點來了,mysql顯示時間是正確的,標准的北京時間,但運行我的WEB應用后,時間竟相差了13個小時,一切的罪魁禍首就是CST是個比較混亂的時區。
CST時區
CST有4種含義
- 美國中部時間 Central Standard Time (USA) UTC-06:00
- 澳大利亞中部時間 Central Standard Time (Australia)
- UTC+09:30 中國標准時 China Standard Time
- UTC+08:00 古巴標准時 Cuba Standard Time UTC-04:00
另外:美國從“3月11日”至“11月7日”實行夏令時,美國中部時間改為 UTC-05:00,與 UTC+08:00 相差 13 小時
JDBC時區協調
mysql驅動向數據插入數據時,需要將應用的時間修改為數據庫所在時區的時間,查詢時再將數據庫存儲的時間轉換為web服務器所在時區的時間
詳細代碼見:com.mysql.cj.jdbc.ConnectionImpl和com.mysql.cj.protocol.a.NativeProtocol
解決方案
在/etc/my.cnf中增加配置(網上“set global time_zone = '+08:00';”設置無效)。
default-time-zone='+8:00'
到此,問題順利解決。
參考:https://juejin.im/post/5902e087da2f60005df05c3d?utm_source=tuicool&utm_medium=referral