1、背景
在實際項目中,服務器都是部署在美國,為了 時間的統一,需要都使用 UTC時間
2、怎么做
默認測試環境 安裝的 mysql 都設置成了 UTC 時區。 但 在 代碼層面, 有很多 更新的 地方用了 .setGmtModified(new Date()); 進行更新操作, 查看數據庫 發現 主動設置 時間的值 都是 當前的時間, 數據庫生成的時間都是 UTC 時間。
經過大量查詢,有博客說是 用 Handler 處理的,, 或者到 Map.xml中 使用 UTC 時間函數的, 但感覺還是很麻煩
在想有沒有一種配置,直接讓 代碼中的時間 到數據庫自動就 映射呢,理論上來說肯定存在的。
最后發現這片文章,SpringBoot 統一時區的方案, 主要 配置如下?:
1、數據庫 設置成 URC
2、數據庫連接池中添加 參數:useLegacyDatetimeCode=false&serverTimezone=UTC
測試后,發現 主動設置的時間 到數據庫都設置成了 UTC時間。
3、存在2個問題
-
在沒有保證服務器 時間的設置時, 只 設置 數據庫連接池配置的時候,查詢出來的 時間變成了 本地時間
-
在沒進行數據庫連接池參數 設置的時候, 查詢出來的結果是 數據庫顯示的時間(UTC),插入的是 本時區的當前時間
-
最后 把 服務器也進行設置,置成 UTC 時區。 測試, 存入 數據庫的是 UTC, 讀取出來的也是 UTC時間
4 總結
這樣的配置是最簡便的,也不需要修改原有的代碼。
4.1 設置 服務器的時區
@PostConstruct
void started() {
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
}
4.2 mybatis 數據庫連接池 添加 useLegacyDatetimeCode=false&serverTimezone=UTC
4.3 數據庫設置成 UTC
5、意外
如果出現 設置 默認時區, 程序運行中不 生效問題,查看是否在 引用的三方包jar中,有對時區進行了設置 導致的。(大坑)