【问题标题】:Datetime issues with Mongo and C#Mongo 和 C# 的日期时间问题
【发布时间】:2011-05-17 20:04:43
【问题描述】:

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

当我存储这个时:

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

我拿回来了:

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

所以如果我尝试这样做:

serverDateTime == mongoDateTime

它总是失败。反正围绕这个?

【问题讨论】:

  • 如果您不关心比较中的毫秒精度,您可以使用serverDateTime == mongoDateTime 而不是Math.Abs((serverDateTime - mongoDateTime).TotalMilliseconds < 1000
  • 这已经足够好了,但是太冗长了,不得不到处做。我想我可以将其作为扩展方法。知道为什么会这样吗?
  • @Bala R 1 tick = 1 万分之一秒,所以我认为你的意思是如果 all 你关心的是毫秒。例如Math.Abs((serverDateTime - mongoDateTime).TotalMilliseconds) < 1.
  • @Conrad 我的逻辑是在一秒钟内忽略任何差异。我没有考虑滴答声,只是考虑了 1000 毫秒 = 1 秒这一事实。
  • @Bala R. 哦,我明白了。我想我脑子里有问题

标签: c# datetime .net-4.0 mongodb


【解决方案1】:

原因是 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 的 BsonRepresentation 而不会丢失精度,但是存储的文档 只有 有 Ticks 或字符串表示,而没有 BSON DateTime,这使得很难与 DateTime 相关查询。

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

【讨论】:

  • 感谢您的提示。我将其存储为日期时间,但使用@Bala R 的扩展方法进行比较。
  • 此属性使用会引发异常“无法应用 BsonRepresentationAttribute 类型的序列化选项属性...”,但 [BsonDateTimeOptions(Representation = BsonType.Document)] 工作正常
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多