關於MongoDB時區問題


由於MongoDb存儲時間按照UTC時間存儲的,其官方驅動MongoDB.driver存儲時間的時候將本地時間轉換為了utc時間,但它有個蛋疼的bug,讀取的時候非常蛋疼的是返回的是utc使時間。一個非常直觀的體現是時間類型字段存儲后和再讀入的是不一致的,一個簡單的示例如下: 

table.InsertOne(new MyClass()
{
    Time =  DateTime.Now,
});

foreach (var data in table.Find(_=> true).ToList())
{
    Console.WriteLine(data.Time);
}

 運行這段代碼就會發現時間讀取出來和寫入的相差8個小時(北京時間)。

本身MongoDB官方是知道這個的,也有很多人反應的這一問題:DateTime timezone problem。,但官方是沒有修改的意向的,官方給出的修改方法是: 在時間類型屬性字段上顯式標注是否為本地時間

[BsonDateTimeOptions(Kind = DateTimeKind.Local)]
public DateTime SomeDateProperty {get;set;}

這個方法雖然看起來沒有什么問題,但用起來麻煩不已,一來要在一些不相關的DTO庫中引入Bson的庫,另一方面加標記很容易遺漏。實際上操作起來是很不方便的。

於是,有人有找到了另一種方法,那就是全局設置時間序列化的方式:

DateTimeSerializationOptions.Defaults = DateTimeSerializationOptions.LocalInstance;

這個方法只在MongoDb.Driver 1.x版本中有效,到了2.x后,DateTimeSerializationOptions已經被廢棄了,可以使用如下方法:

var serializer = new DateTimeSerializer(DateTimeKind.Local, BsonType.DateTime);
BsonSerializer.RegisterSerializer(typeof(DateTime), serializer);

參考文章:

 


免責聲明!

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



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