springboot 統一時區


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中,有對時區進行了設置 導致的。(大坑)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM