SpringBoot 統一時區的方案

llla發表於2019-01-18

UTC時間是什麼

協調世界時,又稱世界統一時間、世界標準時間、國際協調時間。
由於英文(CUT)和法文(TUC)的縮寫不同,作為妥協,簡稱UTC。

    UTC +時區差=本地時間
複製程式碼

中國時間

中國大陸、中國香港、中國澳門、台灣、蒙古國、新加坡、
馬來西亞、菲律賓、西澳大利亞州的時間與UTC的時差均為+8,也就是UTC+8。
複製程式碼

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

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

2.保證伺服器時區為UTC

    服務啟動的時候,將當前時區設定為UTC,程式碼如下:
複製程式碼
    @SpringBootApplication
    public class Application {
      @PostConstruct
      void started() {
        TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
複製程式碼

3.保證資料庫時區為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,否則無效。
複製程式碼

相關文章