Как правильно сохранить дату? - PullRequest
24 голосов
/ 09 ноября 2011

Я пытаюсь сохранить дату (используя официальный драйвер C #):

val = DateTime.Parse(value).Date; //Here date is {11/11/2011 12:00:00 AM}
var update = Update.Set("Date", val);
...

Когда я выбираю Дата из базы данных, значение равно {11/10/2011 22:00:00 PM}

Как сохранить только ту дату, которую я хочу?

Ответы [ 6 ]

42 голосов
/ 09 ноября 2011

c # драйвер по умолчанию (без дополнительных настроек) сохраняет локальные даты как дату utc в базу данных (дата - смещение часового пояса), но читает обратно без каких-либо действий (то есть дата utc).

Из-за этого при загрузке datetime из базы данных вы получаете diff через 2 часа (смещение вашего часового пояса).Существует два подхода, как сказать, чтобы драйвер mongodb c # преобразовывал даты utc в даты местного часового пояса во время десериализации:

1. через атрибуты для определенного поля даты:

[BsonDateTimeOptions(Kind = DateTimeKind.Local)]
public DateTime SomeDateProperty {get;set;}

2. через глобальныйнастройки для всех полей даты и времени (по умолчанию UtcInstance):

DateTimeSerializationOptions.Defaults = DateTimeSerializationOptions.LocalInstance;

Как только вы выполните # 1 или # 2, вы увидите локальную дату.

Обновление:


# 2 устарел в последней версии драйвера, поэтому используйте код ниже:

BsonSerializer.RegisterSerializer(typeof(DateTime), 
             new DateTimeSerializer(DateTimeSerializationOptions.LocalInstance));

Обновление:


# 2 снова изменилось:

BsonSerializer.RegisterSerializer(typeof(DateTime), DateTimeSerializer.LocalInstance);
2 голосов
/ 09 ноября 2011

Вы столкнулись с проблемой часового пояса. Ваш объект даты, вероятно, находится в часовом поясе, отличном от UTC (на 2 часа вперед), или ваш часовой пояс по умолчанию настроен на что-то отличное от UTC. Драйвер преобразует дату в соответствующий часовой пояс перед сохранением в базе данных.

Обычно вы не заметите этого, поскольку обратное (получение даты UTC из базы данных) должно преобразовать ее обратно в исходный часовой пояс. Может быть проблема с драйвером, который вы используете, или C # может потребоваться немного больше кода, чтобы сделать это правильно.

Хранение дат в виде строк, как правило, не очень хорошая идея, поскольку отключает диапазонные запросы по датам.

1 голос
/ 13 августа 2016

2.2.4.26 снова изменилось:

BsonSerializer.RegisterSerializer(typeof(DateTime), DateTimeSerializer.LocalInstance);
1 голос
/ 17 ноября 2014

Mongo хранит все в UTC, в случае, если ваше время - UTC, это поможет

val = DateTime.SpecifyKind(val , DateTimeKind.Utc);
var update = Update.Set("Date", val);
0 голосов
/ 18 марта 2019

В моем случае [BsonDateTimeOptions(Kind = DateTimeKind.Local)] не работает.

То, что я сделал, ниже

    DateTime _someDateProperty ;
    public DateTime SomeDateProperty 
    {
        get { return _someDateProperty ; }
        set
        {
            _someDateProperty = new DateTime(value.Ticks, DateTimeKind.Local);
        }
    }
0 голосов
/ 09 ноября 2011

Mongodb Значение даты хранится в формате «UTC DateTime», который включает в себя как дату, так и время. так что вы просто не можете хранить дату в поле. Вместо этого вы можете получить только часть даты в коде своего приложения после получения из Монго.

как в c #

datevalue.ToString("MM/dd/yyyy");

или

datevalue.ToShortDateString() 
...