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; } }