Проблемы с датой и временем в Mongo и C # - PullRequest
13 голосов
/ 18 мая 2011

У меня проблема с сохранением и получением дат в Mongo с использованием драйвера c #.По какой-то причине это обрезает галочки.

Когда я сохраняю это:

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

Я получаю это обратно:

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

Так что, если я попытаюсь сделать:

serverDateTime == mongoDateTime

Это всегда терпит неудачу.Во всяком случае вокруг этого?

Ответы [ 2 ]

10 голосов
/ 18 мая 2011

Причина в том, что формат BSON DateTime хранит значения с меньшей точностью, чем значение .NET DateTime, поэтому при чтении его из базы данных значение усекается.

Если значение DateTime являетсяСвойство класса C #, который вы сериализуете, вы можете попросить сериализатору сериализовать значение DateTime в виде внедренного документа, содержащего как значение BSON DateTime (усеченное), так и исходное значение .NET DateTime (сохраненное в виде отметок).В этом случае значение не будет усечено при десериализации.

Например:

public class MyClass {
    public ObjectId Id;
    [BsonRepresentation(BsonType.Document)]
    public DateTime MyDateTime;
}

Вы также можете использовать BsonRepresentation Int64 или String и не потерять точность, но затем сохраненный документ только имеет тики или строковое представление, а не BSON DateTime, что затрудняет выполнение запросов, связанных с DateTime.

Вы также должны иметь в виду, что значения DateTime хранятся в UTCв базе данных.Рекомендуется всегда использовать значения UTC для хранения и использовать только местное время при отображении их пользователю.

3 голосов
/ 18 мая 2011

Вот расширение, которое вы можете использовать:)

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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...