MongoDB常見問題解答:時間與時區

MongoDB中文社群發表於2022-03-04




這期主要來聊一下 MongoDB中的時區問題

這個問題雖然簡單,總有同學會問到,集中解答一下。


提出這個問題通常是因為在使用 Mongo Shell 後發現其中展示的時間比中國時間落後8小時而產生的。


比如:插入時間是2021年1月1日00:00:00,在Shell中看到的則是ISODate("2020-12-31T16:00:00Z"),很多人由此產生疑惑, 8小時去哪了? 是不是出錯了?


理解這個問題首先要理解 時區的概念。當你同時向一個身處中國的人和身處美國的人提問現在是幾點時,中國人回答中午12點,美國人回答的卻是凌晨4點。這有區別嗎?他們說錯了嗎?他們都沒錯。他們回答不一樣是因為身處不同的時區,但是他們指代的都是同一個時間: 現在


也可以說,全世界只有一個時間,只是大家描述它的方式不一樣——根據自己身處的地區。而有個現狀會把這個問題搞得更復雜,那就是 夏令時


我國現在已經不實施夏令時了(對,過去有過!暴露年齡!),但是世界上有很多國家仍然保留夏令時的習慣。這讓原本複雜的時間表達更加雪上加霜。這在實施同樣的時間規則的人之間不會造成問題。


但是在國際化的今天,你知道一箇中國人跟一個實施了夏令時的德國人約一個會議時間有多難?或者在看到一個德國時間2020年5月7日18點,你知道它是英國時間的幾點嗎?你不光要知道英德的時差,還要知道2020年5月7日這個時間在德國是不是在夏令時的影響範圍內,以及在英國它是不是在夏令時的影響範圍內。現在有沒有覺得小瞧了時間的複雜性?


為了簡化這些複雜的問題,有了UTC (Universal Time Coordinated)時間標準以及表達時間的標準ISO 8601,也就是我們在MongoDB中看到的 ISODate


ISODate的表示方法簡單來說就是年月日時分秒+時區。 以我們前面的例子來說,身處中國時我們的時區是UTC+8,用ISODate表達則是ISODate("2021-01-01T00:00:00+0800")。這個時間在MongoDB中的表達是ISODate("2020-12-31T16:00:00Z"),其中的Z表示UTC(或者UTC+0)。由於時區的不同導致了表達方式不同,但這兩個時間指代的是同一時刻,所以兩者沒有什麼不一樣。而在展示時,則應該根據你的使用者所處的時區來決定到底顯示哪一個結果。


需要注意的是: 有些語言的驅動(例如Java/C#)在讀取到時間時會自動轉換為伺服器時間,所以不需要再人為轉換。有些語言(例如Python)則不會自動轉換。使用時應該根據你的實際情況決定處理方式。



作者介紹: 張耀星

MongoDB大中華區首席諮詢顧問,供職於MongoDB售後服務團隊5年+,擁有近10年MongoDB使用經驗。



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69961190/viewspace-2864552/,如需轉載,請註明出處,否則將追究法律責任。

相關文章