C# Mongo和C的日期时间问题#

C# Mongo和C的日期时间问题#,c#,datetime,.net-4.0,mongodb,C#,Datetime,.net 4.0,Mongodb,我在使用c#驱动程序与Mongo保存和检索日期时遇到问题。出于某种原因,它正在截断蜱虫 当我存储此文件时: DateTime -> 5/17/2011 7:59:13 PM Ticks -> 634412591533741650 我把这个拿回来: DateTime -> 5/17/2011 7:59:13 PM Ticks -> 634412591533740000 因此,如果我尝试这样做: serverDateTime == mongoDateTime 它总是

我在使用c#驱动程序与Mongo保存和检索日期时遇到问题。出于某种原因,它正在截断蜱虫

当我存储此文件时:

DateTime -> 5/17/2011 7:59:13 PM 
Ticks -> 634412591533741650
我把这个拿回来:

DateTime -> 5/17/2011 7:59:13 PM 
Ticks -> 634412591533740000
因此,如果我尝试这样做:

serverDateTime == mongoDateTime

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

这里有一个扩展,您可以使用:)

公共静态类比较
{
专用静态整数精度毫秒=1000;
公共静态bool MongoEquals(此DateTime DateTime,DateTime mongoDateTime)
{
返回Math.Abs((dateTime-mongoDateTime.totalmillizes)
原因是BSON DateTime格式存储的值的精度低于.NET DateTime值,因此当您从数据库读回该值时,该值已被截断

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

例如:

public class MyClass {
    public ObjectId Id;
    [BsonRepresentation(BsonType.Document)]
    public DateTime MyDateTime;
}
您还可以使用Int64或String的BSON表示形式,并且不会丢失精度,但是存储的文档只有记号或字符串表示形式,没有BSON DateTime,这使得与DateTime相关的查询很难进行


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

如果您不关心比较中的毫秒精度,而不是
serverDateTime==mongoDateTime
您可以执行
Math.Abs((serverDateTime-mongoDateTime).totalmillizes<1000
这已经足够好了,但是太冗长了,不必到处都做。我想我可以把它作为一个扩展方法来做。知道为什么会这样吗?@Bala R 1 tick=1千万分之一秒,所以我想你的意思是,如果你只关心毫秒。例如
Math.Abs((serverDateTime-mongoDateTime).Total(毫秒)@康拉德,我的逻辑是忽略一秒下的任何差异。我没有考虑滴答声,只是1000毫秒=1s的事实。@巴拉R.哦,我明白了。我想我的头上有一个来自提示感谢的问题。我将把它存储为一个日期时间,但是使用@ Bala R的扩展方法进行比较。这个属性用法抛出异常。“无法应用BsonRepresentationAttribute类型的序列化选项属性…”对于我来说,但是
[BsonDateTimeOptions(Representation=BsonType.Document)]
工作正常
public class MyClass {
    public ObjectId Id;
    [BsonRepresentation(BsonType.Document)]
    public DateTime MyDateTime;
}