前言
mysql8.x的jdbc升級了,增加了時區(serverTimezone)屬性,並且不允許為空。
血案現場
配置jdbc的URL:jdbc:mysql://[IP]:[PORT]/[DB]?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true
應用運行一段時間后,發現數據庫中登記的時間和正常的時間不一致。
查詢表字段值:
而現在電腦的時間是:
問題排查
1、服務器時間不同步
使用命令:date,查看linux服務器時間
[root@abc ~]# date
Sat Mar 7 18:43:30 CST 2020
服務器的機器時間沒有問題
2、程序問題
uLog.setLogTime(new Date());
程序是使用的機器時間,不會有問題
3、數據庫時間
查看數據庫時間:select sysdate()
mysql> select sysdate();
+---------------------+
| sysdate() |
+---------------------+
| 2020-03-07 18:48:01 |
+---------------------+
1 row in set
時間也是沒有問題,最后考慮到jdbc增加了時區屬性
問題根源
UTC是什么時區
不屬於任意時區 。協調世界時,又稱世界統一時間,世界標准時間,國際協調時間,簡稱UTC。
時區(Time Zone)是地球上的區域使用同一個時間定義。1884年在華盛頓召開國際經度會議時,為了克服時間上的混亂,規定將全球划分為24個時區。在中國采用首都北京所在地東八區的時間為全國統一使用時間。
例:已知東京(東九區)時間為5月1日12:00,求北京(東八區)的區時?北京時間=12:00-(9-8)=11:00(即北京時間為5月1日11:00)。
問題找到了,就是時區字段的問題
解決方法
修改jdbc時區,改成服務器所在地的真實時區
修改前:jdbc:mysql://[IP]:[PORT]/[DB]?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true 修改后:jdbc:mysql://[IP]:[PORT]/[DB]?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
重啟應用,發現時間是正確的
+---------------------+ | log_time | +---------------------+ | 2020-03-07 19:04:06 | | 2020-03-07 19:04:03 | | 2020-03-07 19:04:03 | | 2020-03-07 19:04:03 | | 2020-03-07 19:04:03 | | 2020-03-07 19:04:03 | | 2020-03-07 19:04:02 | | 2020-03-07 19:04:02 | | 2020-03-07 19:03:51 | | 2020-03-07 10:40:35 | | 2020-03-07 10:40:35 | | 2020-03-07 10:40:35 |