使用C#在MongoDB中使用IsoDate和DateTime

时间:2011-10-21 09:12:35

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

让我们假设我想在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

这是创建dateTimes的代码(_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,但没有找到任何理由为什么它应该被转移。可以吗?

1 个答案:

答案 0 :(得分:12)

我认为问题在于DateTime.TryParse给了DateTime Kind Local ...而ISO日期始终在UTC }。我希望MongoDB代码的某些部分将本地DateTime转换为UTC中的一个。这主要是不是你的错 - 基本上是DateTime is a very confusing type

我怀疑如果你在解析代码中指定DateTimeStyles.AssumeUniversal,它会做你期望的。

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