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

Как правильно сохранить дату?

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

DateTimeSerializationOptions.Defaults = DateTimeSerializationOptions.LocalInstance;

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

Update:


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

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

Update:


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

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

val = DateTime.SpecifyKind(val , DateTimeKind.Utc);
var update = Update.Set("Date", val);

Ответ 5

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

как в С#

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

или

datevalue.ToShortDateString()