Mongo和C#的日期时间问题

我在使用c#驱动程序保存和检索Mongo时遇到问题。 由于某种原因,它正在截断滴答声。

当我存储这个:

DateTime -> 5/17/2011 7:59:13 PM Ticks -> 634412591533741650 

我得到了回复:

 DateTime -> 5/17/2011 7:59:13 PM Ticks -> 634412591533740000 

所以,如果我尝试这样做:

 serverDateTime == mongoDateTime 

它总是失败。 不管怎么说?

原因是BSON DateTime格式存储的精度低于.NET DateTime值,因此当您从数据库中读取它时,该值已被截断。

如果您的DateTime值是您正在序列化的C#类的属性,您可以要求序列化程序将DateTime值序列化为包含BSON DateTime值(截断)和原始.NET DateTime值(存储为Ticks)的嵌入式文档。 在这种情况下,反序列化时不会截断该值。

例如:

 public class MyClass { public ObjectId Id; [BsonRepresentation(BsonType.Document)] public DateTime MyDateTime; } 

您还可以使用Int64或String的BsonRepresentation而不会丢失精度,但是存储的文档只有 Ticks或字符串表示而没有BSON DateTime,这使得很难进行与DateTime相关的查询。

您还需要记住,DateTime值以UTC格式存储在数据库中。 最佳做法是始终使用UTC值进行存储,并仅在向用户显示时使用本地时间。

这是你可以使用的扩展:)

 public static class MongoDateComparison { private static int precisionInMilliseconds = 1000; public static bool MongoEquals(this DateTime dateTime, DateTime mongoDateTime) { return Math.Abs((dateTime - mongoDateTime).TotalMilliseconds) < precisionInMilliseconds; } }