Подтвердить что ты не робот

Вопросы времени и времени с Mongo и С#

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

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

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

Я верну это:

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

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

serverDateTime == mongoDateTime

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

4b9b3361

Ответ 1

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

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

Например:

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

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

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

Ответ 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;
    }
}