前段時間把項目 SpringBoot 版本提高了,提高到了 2.1.7,之前版本不記得了。項目所有表都添加了 create_time 和 update_time 字段,並設置默認值為 CURRENT_TIMESTAMP。 有一天無意間發現網頁上顯示的時間,比如用戶登錄時間和數據庫里顯示不一樣,頁面上的早了幾個小時。比如 當前時間是 2019-10-19 18:12:43,數據庫時間也是 2019-10-19 18:12:43;但是頁面缺顯示 2019-10-20 02:12:43。 多對比幾組時間分析,發現 Java 的時間總比數據庫的早 8 個小時。
問題原因
導致整個問題的原因是之前的 mysql-connector-java 依賴沒有指定版本,默認跟隨 spring-boot-dependencies 里的版本,因為之前 springboot 版本相對低點,所以驅動版本是 5.1,沒有暴露問題 但是升級到 2.1.7 后,里面默認指定 mysql-connector-java 版本為 8.0.17,這個我之前其實是知道的,springboot 高版本里的默認依賴都會相對更高。 總來來說:問題在 MySQL8.0的驅動包跟之前不一樣了,默認時區是全球統一時間 (UTC),北京時間是 UTC+8。
解決辦法
解決辦法很簡單,在 jdbc 驅動的 url 上加上 serverTimezone=Asia/Shanghai 如果不加 serverTimezone 或設置為 UTC 都是差 8 個小時,設置成為上海的時區就行(serverTimezone=GMT%2B8)。