1. 程式人生 > >SpringBoot 統一時區的方案 96 Devid 關注 2018.01.11 20:22 字數 262 閱讀 91評論 0喜歡 0 系統採用多時區設計的時候,往往我們需要統一時區,需要統一的地

SpringBoot 統一時區的方案 96 Devid 關注 2018.01.11 20:22 字數 262 閱讀 91評論 0喜歡 0 系統採用多時區設計的時候,往往我們需要統一時區,需要統一的地

系統採用多時區設計的時候,往往我們需要統一時區,需要統一的地方如下:

  • 伺服器(Tomcat服務)
  • 資料庫(JPA + Hibernate)
  • 前端資料(前端採用Vuejs)

思路為:
將資料庫和伺服器的時間都採用標準時區UTC儲存處理。前端拿到標準時區的資料,統一根據使用者所在時區進行轉換。這樣保證了後端資料時區的一致性,前端根據實際情況進行渲染。

保證伺服器時區為UTC

服務啟動的時候,將當前時區設定為UTC,程式碼如下:

@SpringBootApplication
    public class Application {
      @PostConstruct
      void started
()
{ TimeZone.setDefault(TimeZone.getTimeZone("UTC")); } public static void main(String[] args) { SpringApplication.run(Application.class, args); } }

這樣就保證了Java程式的時區為UTC。

保證資料庫時區為UTC

Hibernate支援設定時區,在Springboot中增加配置如下:

spring.jpa.properties.hibernate.jdbc.time_zone = UTC

如果是MySQL資料庫,連線池連結後面增加配置如下:

?serverTimezone=TimeZone&useLegacyDatetimeCode=false

如:

spring.datasource.url=jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=utf-8&useLegacyDatetimeCode=false&serverTimezone=UTC

其中useLegacyDatetimeCode引數預設是true,我們需要手動設定為false,否則無效。