國際化軟件如何保證MySQL的時間是正確的


時間戳 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

 

 

 

 


免責聲明!

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



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