IsoDate и DateTime в MongoDB с использованием C # - PullRequest
8 голосов
/ 21 октября 2011

Давайте предположим, что я хочу запросить монго на dateTime.У меня есть две переменные 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 Ответ

12 голосов
/ 21 октября 2011

Я считаю, что проблема в том, что DateTime.TryParse дает вам DateTime с Kind из Local ... в то время как дата ISO всегда находится в UTC .Я ожидаю, что какая-то часть кода MongoDB преобразует локальный DateTime в UTC.Это в значительной степени не ваша ошибка - в основном, DateTime очень запутанный тип .

Я подозреваю, если вы укажете DateTimeStyles.AssumeUniversal в своем коде синтаксического анализа,делай то, что ожидаешь.

(Бесстыдный плагин: мой собственный проект, Noda Time , делает все это намного проще ...)

...