【问题标题】:IsoDate and DateTime in MongoDB using C#使用 C# 在 MongoDB 中的 IsoDate 和 DateTime
【发布时间】:2011-10-21 09:12:34
【问题描述】:

假设我想在 dateTime 上查询 mongo。我有两个 C# 变量代表开始和结束日期。

1) {20.10.2011 00:00:00}

2) {22.10.2011 00:00:00}

现在 BsonDateTime.Create(dateTime) 也将它们转换为 BSON DateTime:

1) 2011-10-20T00:00:00 MongoDB.Bson.BsonDateTime

2) 2011-10-22T00:00:00 MongoDB.Bson.BsonDateTime

这是创建日期时间的代码(_value 是一个字符串):

DateTime dateTime;
bool parsed = DateTime.TryParse(_value, out dateTime);
if (!parsed)
    throw new FormatException("Wrong format for a query param");
return BsonDateTime.Create(dateTime);

接下来的代码构建查询:

private QueryComplete MakeQuery(string key, BsonValue value)
{
    if (_separatorType == ">=")
        return Query.GTE(key, value);
    if (_separatorType == "<=")
        return Query.LTE(key, value);
    return Query.EQ(key, value);
}

而且我确实在查询中得到了这样一个奇怪的值:

"Sessions.End" : { "$gte" : ISODate("2011-10-19T21:00:00Z"), "$lte" : ISODate("2011-10-21T21:00:00Z") },

好吧,我用谷歌搜索了 ISODate,但没有找到任何应​​该转移它的理由。可以吗?

【问题讨论】:

  • 您说您有两个 C# 变量,但您没有显示它们是如何初始化的,甚至没有显示它们是什么类型。我强烈怀疑这是事情的核心,但我们不能不看代码就知道。我的猜测是您创建了 local DateTime 值而不是 UTC 值。
  • @Jon Skeet,添加了创建 dateTime 的代码,什么是 UTC?
  • 查看我的答案 - 点击链接了解 UTC 说明。基本上这是一个时区问题,我怀疑......

标签: c# datetime mongodb mongodb-.net-driver


【解决方案1】:

我认为问题在于 DateTime.TryParse 给你一个 DateTimeKindLocal... 而 ISO 日期总是在 UTC。我希望 MongoDB 代码的某些部分正在将本地 DateTime 转换为 UTC 格式。这很大程度上不是你的错 - 基本上,DateTime is a very confusing type

我怀疑如果您在解析代码中指定DateTimeStyles.AssumeUniversal,它会按照您的预期进行。

(无耻插件:我自己的项目,Noda Time,让这一切变得更简单......)

【讨论】:

  • 非常感谢乔恩,它确实有帮助,而且这个通用的东西真的很令人困惑,我想更好地掌握日期时间
  • mongodb 始终将数据时间存储为 UTC,mongodb c# 驱动程序在保存值时转换为 utc,在从 db 读取值时转换回本地。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-18
  • 2017-01-21
  • 2020-12-14
  • 1970-01-01
  • 1970-01-01
  • 2017-05-21
  • 1970-01-01
相关资源
最近更新 更多