1. 程式人生 > >mybatis查詢mysql的datetime類型數據時間差了14小時

mybatis查詢mysql的datetime類型數據時間差了14小時

ati onf caption centos 數據庫時間 charset format 類型轉換 .get

今天使用mybatis查詢mysql中的數據時,莫名其妙的所有時間都出錯了,所有時間都比數據庫時間多了14小時,考慮了一下,初步判定是系統時區的問題。因為mysql時區設置默認是操作系統時區,查看了下centos時區,東8區沒有錯,所以可以判定是代碼裏面設置了一個錯誤的時區。

技術分享圖片

現在開始調試mybatis源碼,調試到mysql-connector-java-6.0.4.jar包的com.mysql.cj.jdbc.io.JdbcTimestampValueFactory的createFromTimestamp方法時,發現mysql的底層驅動程序對從數據庫查詢出來的時間用了一個Calender做類型轉換,Calender記錄中包含的時區為CST,跟中國的時區Asia/Shanghai正好差了14小時。

技術分享圖片

那麽為什麽mybatis連接數據庫會使用CST的美國時間呢?繼續查看源碼發現

mysql連接數據庫的時候會從mysql讀取系統的時區設置,調試com.mysql.cj.mysqla.MysqlaSession.java的configureTimezone方法發現,this.getServerVariable("system_time_zone")從系統裏面讀出來的時區設置是CST

技術分享圖片

至此問題已經清楚了,是mysql設置的時區不對,登陸linux,執行mysql -uroot -p, 然後運行命令show variables like ‘%time_zone%‘,發現system_time_zone項果然是CST。

技術分享圖片

至此,排查問題結束,修改一下mysql的時區設置即可。

技術分享圖片



作者:許武順
鏈接:https://www.jianshu.com/p/ea7ef2d29940
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並註明出處。

mybatis查詢mysql的datetime類型數據時間差了14小時