CST時區,MYSQL與JAVA-WEB服務器時間相差13個小時的問題


最近倒騰了一台阿里雲主機,打算在上面裝點自己的應用。使用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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM