我的Mysql版本是 8.0.18
使用的Driver是 com.mysql.cj.jdbc.Driver
當我們連接時沒有指定時區,mysql會使用設置中time_zone
所設置的時區,這個值默認是SYSTEM
,也就是指向system_time_zone
這個變量,在中國,這個值顯示是CST
。
mysql> show variables like "%time_zone%";
+------------------+--------+
| Variable_name | Value |
+------------------+--------+
| system_time_zone | CST |
| time_zone | SYSTEM |
+------------------+--------+
CST可以代表四個時區!!這是一個有歧義的名字!壞就壞在這里了。java會以為這個CST是美國中部時間 (Central Standard Time )。這樣就導致了JDBC獲取TimeStamp時的時區出錯!。
解決方法有兩種:
- 連接時指定時區,加參數serverTimezone=Aisa/Shanghai
- 改mysql變量,從
SYSTEM
改為+08:00
,方法是set global time_zone = '+08:00';