1.問題源自何處?
之前用的mysql 8.0以上的版本連接時都需要在url后面加 serverTimezone=UTC
<property name="url" value="jdbc:mysql://localhost:3306/db2?serverTimezone=UTC" />
實際上是指出核數據庫的時區為美國。因為我們的數據庫的時區是美國的,而我們連接的時候用的是中國的北京時間,然后比美國早上8個小時,然后呢用的時候就必須指出我們當前用的時間是美國的時間,這樣才能連接上數據庫。
2.那么可不可以直接將數據庫的默認時區改到中國呢?
當然是可以的,如果是windows系統,在mysql解壓路徑下的 my.ini 文件的 [mysqld] 里面加上 default-time-zone=’+8:00’ ;
改了之后那么現在就可以直接用 “裸url了”。
<property name="url" value="jdbc:mysql://localhost:3306/db2" />
mysql 使用了UTC方式來記錄日志時間,也就是說這是個世界統一時間,存入mysql中的時間只能是UTC時間。mysql的timestamp類型數據,存儲的時候會轉化成UTC時間戳,讀取時再從UTC轉化為本地時間戳。各地的標准時間為格林威治時間(G.M.T)加上 (+) 或減去 (-) 時區中所標的小時和分鍾數時差。中國是GMT+8.
1.1 查看mysql當前時間,當前時區
> select curtime(); #或select now()也可以 +-----------+ | curtime() | +-----------+ | 15:18:10 | +-----------+ > show variables like "%time_zone%"; +------------------+--------+ | Variable_name | Value | +------------------+--------+ | system_time_zone | CST | | time_zone | SYSTEM | +------------------+--------+ 2 rows in set (0.00 sec) #time_zone說明mysql使用system的時區,system_time_zone說明system使用CST時區
1.2 修改時區
set global time_zone = '+8:00'; ##修改mysql全局時區為北京時間,即我們所在的東8區 set time_zone = '+8:00'; ##修改當前會話時區 flush privileges; #立即生效
解決方法:
方法1、使用6.0以下版本的jdbc:降版本,並不推薦;
方法2、在jdbc url指定默認時區:
還有一種是在jdbc連接的url后面加上serverTimezone=UTC或GMT即可,如果指定使用gmt+8時區,需要寫成GMT%2B8,否則可能報解析為空的錯誤。示例如下:
jdbc.url=jdbc:mysql://localhost:3306/demo?serverTimezone=UTC&characterEncoding=utf-8 jdbc.url=jdbc:mysql://localhost:3306/demo?serverTimezone=GMT%2B8&characterEncoding=utf-8 jdbc.url=jdbc:mysql://localhost:3306/demo?serverTimezone=Asia/Shanghai&characterEncoding=utf-8
增加:
serverTimezone=UTC serverTimezone=GMT%2B8
推薦使用如下:
serverTimezone=Asia/Shanghai
方法3、在數據庫配置中添加默認時區:
SQL語句配置全局時區
mysql> show variables like '%time_zone%'; +------------------+--------+ | Variable_name | Value | +------------------+--------+ | system_time_zone | | | time_zone | SYSTEM | +------------------+--------+ 2 rows in set, 1 warning (0.00 sec) #設置當前session時區,即時生效,但僅作用於當前session mysql> set time_zone='+8:00'; Query OK, 0 rows affected (0.00 sec) #設置全局時區,即時生效,作用於所有session mysql> set global time_zone='+8:00'; Query OK, 0 rows affected (0.00 sec) mysql> show variables like '%time_zone%'; +------------------+--------+ | Variable_name | Value | +------------------+--------+ | system_time_zone | | | time_zone | +08:00 | +------------------+--------+ 2 rows in set, 1 warning (0.00 sec)
或者通過修改my.cnf配置文件來修改時區:
# vim /etc/my.cnf ##在[mysqld]區域中加上 default-time_zone = '+8:00' # /etc/init.d/mysqld restart ##重啟mysql使新時區生效
我遇到的問題是:在數據庫中select now(); 返回的時間正常,但是jdbc查詢出的時間比實際時間要早8小時:
解決辦法是jdbc連接的url中配置的時區參數:&serverTimezone=GMT%2B8