與 MySQL 因“CST” 時區協商誤解導致時間差了13 小時


CST 時區
名為 CST 的時區是一個很混亂的時區,有四種含義:

  • 美國中部時間 Central Standard Time (USA) UTC-05:00 / 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 小時。

 

背景:偶然一次,發現從數據庫讀出的時間打印出來比實際時間多了13小時。
檢查數據庫時區:

而數據庫連接沒有定義具體時區:

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&useSSL=true&allowMultiQueries=true

 

分析原因

mybatis 在與 MySQL 協商會話時區時,mybatis 根據查詢數據庫時區,獲取到 CST ,認為數據庫時區是美國中部時間 UTC-05:00,而當前系統時區是 UTC+08:00,所以在拿到數據庫的時間上面加了13個小時。導致最后時間比實際多。

 

解決辦法

1:修改數據庫時區為 UTC+08:00,不用CST這種有歧義的定義。

mysql> set global time_zone = '+08:00'; Query OK, 0 rows affected (0.00 sec) 

mysql> set time_zone = '+08:00'; Query OK, 0 rows affected (0.00 sec)

或者修改 my.cnf 文件,在 [mysqld] 節下增加 default-time-zone = '+08:00'。

2:與數據庫連接時,定義時區,避免mybatis框架從mysql獲取時區。在連接上加上  serverTimezone=GMT%2B8

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&useSSL=true&allowMultiQueries=true&serverTimezone=GMT%2B8

 

環境:

  MySQL5.7.12

  SpringBoot  2.0.1.RELEASE

  MyBatis  3.4.1

 

 如有錯誤的地方,請指出。謝謝評論。

參考:

https://blog.csdn.net/crystalqy/article/details/90896673

https://juejin.im/post/5902e087da2f60005df05c3d


免責聲明!

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



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