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
如有錯誤的地方,請指出。謝謝評論。
參考: