時間戳 UNIX 時間 是沒有時區概念的都是按照倫敦時間 UTC 1970年1月1日00:00:00
時間戳 UNIX 時間 是沒有時區概念的都是按照倫敦時間 UTC 1970年1月1日00:00:00
MySQL數據庫存儲列最好是 int64 存儲 UNIX 時間
如果展示為中國北京時間,那么如果 unix time 是 0 ,在倫敦是 1970-01-01 00:00:00 在中國是 1970-01-01 08:00:00
數據庫里面存儲的一定是 UTC 的也就是0
展示的話,帶上時區轉換
1、時區
同一個時間點,比如 英國的1970-01-01 00:00:00 的那一個時刻,在東八區北京時間是:1970-01-01 08:00:00
所以,時間戳的秒數也會不同:
北京時間戳為0,對應的時間點是 1970-01-01 08:00:00
英國的時間戳為0,對應的時間點是 1970-01-01 00:00:00
2、MySQL的時間存儲
dateTime 沒有時區概念,相當於字符串入庫
timestamp 存儲時,MySQL將TIMESTAMP
值從當前時區轉換為UTC時間進行存儲,查詢時,將數據從UTC轉換為檢索的當前時區。(其他類型(如DATETIME)不會發生這種情況。)
參考鏈接:https://blog.csdn.net/m0_38072683/article/details/105011313
時區 show variables like "%time_zone";
system_time_zone -- 系統時區
3、Java連接MySQL獲取時間如何展示
我們想要的情況:
如果數據庫之中存儲的時間是 北京時間 1970-01-01 08:00:00
如果是北京的用戶,看到的時間是 1970-01-01 08:00:00 GMT+8
如果是英國的用戶,看到的時間是 1970-01-01 00:00:00 UTC
(當然用戶只會看到不帶時區的日期時間部分)
4、影響Java使用mybatis查詢時間,然后轉json數據輸出,影響時區的有哪幾個配置
1. spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=false
(連接配置的時區信息 ,CST 北京時間)
2. @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm")
(Jackson解析數據的時區配置)
5、時區錯誤顯示的情況有哪些
情況一:北京的用戶,在08:00操作了一條數據,存儲了一條 GMT+8 2020-01-01 08:00:00 的時間點,在MySQL之中存儲時間的數據格式是 datetime
英國的用戶讀取這條數據時候( 2020-01-01 02:00:00 ),拿到操作時間也是 2020-01-01 08:00:00 那么明顯是錯誤的,出現錯誤的原因是沒有將時間轉為 UTC 2020-01-01 00:00:00
情況二:北京的用戶存儲的時間是 GMT+8 2020-01-01 08:00:00 存儲的時間格式是timestamp(有時區)
英國的用戶讀取數據時候 orm 實體類User.class之中的字段屬性值也是對的,但是轉jackson的時候錯誤配置了
spring.jackson.date-format: yyyy-MM-dd HH:mm:ss spring.jackson.time-zone: GMT+8
也就是對於jackson而言,將 UTC 2020-01-01 00:00:00 轉成了 GMT+8 2020-01-01 08:00:00 (時區信息沒展示)
6、如何保證數據正常
spring.datasourc.url 配置timezone為UTC,這樣與MySQL的時間戳是UTC,北京的用戶時間 CST 2020-01-01 08:00:00 在MySQL之中的時間是 UTC 2020-01-01 00:00:00
MySQL的時區可以通過 show variables like "%time_zone"; 看到
url里面的時區只是決定了從 java過去的時間格式和從MySQL查詢回來的時間,帶上了對應的時區。
不管MySQL還是spring.datasource.url都固定為UTC即可避免,spring.datasource.url 存儲 GMT+8 2020-01-01 08:00:00到MySQL,卻被認為是 UTC 2020-01-01 08:00:00
jackson的time-zone是服務器當前的時區(北京的用戶對應北京的時區,英國的用戶對應英國的時區)
spring的mariadb連接配置的timezone是 UTC 會導致 北京時間 08:00 在MySQL之中存儲的數據是 00:00 嗎?
spring的mariadb連接配置的timezone是 Asia/Shanghai 會導致我存儲的時間就是 GTM+8 2022-01-01 08:00 ,如果是datetime格式那么存儲的就是 2022-01-01 08:00
如果是UTC那么存儲的就是 2022-01-01 00:00:00 (即使服務器是北京時間 08:00:00)
]
分別以 UTC 和 Asia/Shanghai 存儲進字段之中,當UTC時候,會將當前 new Date的北京時間轉為 UTC時間存儲;
讀取的時候,當spring.maridb的url的serverTimezone 為UTC的時候,上面的正常
為Asia/Shanghai的時候,下面的正常,所以存儲進去和讀取的時候請保持一致;
原因是:
讀取的時候並且MySQL會默認其時區為Java會話帶過來的時區,所以使用UTC讀取的時候,上面的第二行(這一行寫入的實際時間是東八區的時間,但是被當成了UTC)的時間讀取出來后變成了
Thu Apr 21 06:24:26 CST 2022
也就是加了8個小時,也就是 MySQL認為它是 UTC 2022-04-20 22:24:26 而java又要這個時間點的東八區的時間
那么就是 CST 2022-04-21 06:24:26
參考博客:
UTC 和 GMT 什么關系? https://www.zhihu.com/question/27052407
記住幾個關鍵字 UTC 、GMT+8