由於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);
參考文章: