天天看點

SpringBoot時區配置

文章目錄

  • 前言
  • 一、測試資料
  • 二、結論
  • 三、對應截圖
    • 表格截圖:
    • -Duser.timezone
    • jdbc:mysql
    • time-zone
    • SQL日志 控制台
    • 接口出參
  • 總結

前言

UTC: 全球标準時間

GMT: 格林威治标準時間

我不知道該怎麼解釋UTC和GMT的關系, 我個人的了解是:

UTC+0=GMT+0,UTC+8=GMT+8 但是UTC不是GMT, GMT也不是UTC

這裡會涉及到五個時區需要注意:

  • JVM時區
  • MySQL時區
  • 系統時區
  • jdbc連結時區
  • jackson指定時區
測試資料 + 結論 + 表格截圖

提示:表格中列出的名稱不是很規範, 大家看一下對應的截圖, 就知道了

一、測試資料

下面會列出一個表格, 就表格中的一些内容先做一下講解:

如果這裡我表達的不是很清楚, 文章的下面也列出了對應的截圖

MySQL系統:        安裝MySQL的系統時間, 查詢指令: date -R
MySQL:           資料庫的時區配置, 查詢指令: SHOW VARIABLES LIKE '%time_zone%'
jdbc:mysql:      jdbc:mysql://*****&serverTimezone=GMT
-Duser.timezone: JVM的時區
time-zone:       spring.jackson.time-zone
SQL日志:          列印的SQL語句, 以及對應的結果
控制台:           當我們查詢出來的資料, 放入entity或者map集合, get出來的值
接口出參:         比如postman調用接口, 傳回的資料
           
MySQL系統 MySQL SQL日志 控制台 時間是否一緻
+0800 CST GMT%2B8 GMT+8 2019-11-22 10:12:13
GMT+2 2019-11-22 04:12:13
UTC 2019-11-22 02:12:13
2019-11-22 18:12:13
GMT+0
GMT%2B2 GMT+3 GMT+4 2019-11-22 11:12:13 2019-11-22 12:12:13
GMT-2 GMT-3 GMT-4 2019-11-22 09:12:13 2019-11-22 08:12:13
+0000 2021-07-21 11:51:16 2021-07-21 10:51:16 2021-07-21 09:51:16

二、結論

通過上面的資料, 我得出一個結論:

SQL日志=

資料庫儲存的資料對應的時間

控制台=

((SQL日志)(2019-11-22 10:12:13)) - (jdbc:mysql)(GMT%2B8)) + (-Duser.timezone)(GMT+8))

= MySQL儲存時間 - jdbc連結指定時區 + jvm時區

= 2019-11-22 10:12:13 - 8 + 8

= 2019-11-22 10:12:13

接口出參=

((SQL日志)(2019-11-22 10:12:13)) - ((jdbc:mysql)(GMT%2B8)) + ((time-zone)(GMT+8))

= MySQL儲存時間 - jdbc連結指定時區 + jackson配置時區

SpringBoot時區配置

SpringBoot時區配置

SpringBoot時區配置

  • 從上面的統計, 時間都是基于MySQL儲存的這個時間, 做對應的±操作
  • 在做涉及時區的項目, 如果就是一個地區, 那就按當地時區設定就行. 但是如果是同一個項目, 多個地區運作, 伺服器就統一設定UTC時間, 包括資料庫UTC, JVM時區UTC, time-zone也就是展示給使用者看的時間, 配置對應的GMT±
  • 我沒有去看對應的源碼, 隻是寫了一個簡單的測試用例得出的結果
  • new Date() = UTC + (-Duser.timezone)
  • 上面表格中列出的, 是不支援UTC±的寫法, 比如-Duser.timezone=UTC-8是識别不出來的

    但是-Duser.timezone=GMT-8或者-Duser.timezone=UTC是可識别的

  • 各個地區對應時區的網址嗎以及對應的用法: https://www.ibm.com/docs/zh/was/9.0.5?topic=ctzs-time-zone-ids-that-can-be-specified-usertimezone-property
  • 根據位址查時區: http://time.tianqi.com/dubai/
  • 具體UTC GMT CST PRT WET CET ECT …等等, 這個含義哈, 這個還得麻煩大家自行處理了, 汗顔, 哈哈哈, 當然也可以參考: 各個地區對應時區的網址嗎以及對應的用法