MongoDB всегда сохраняет 03:00:00 как время для свойства DateTime - PullRequest
1 голос
/ 03 февраля 2020

Учитывая, что у меня есть следующий код:

public class Project
{
   ...

   public DateTime CreationDate { get; set; }

   ...
}

var project = new Project();
project.CreationDate = new DateTime(2020, 2, 3); // Setting 03/02/2020 date

await _mongoDbContext.Projects.InsertOneAsync(project);

После вставки документа, когда я его получаю, свойство CreationDate имеет 03/02/2020 03:00:00 значение вместо 03/02/2020 00: 00: 00 .

Редактировать

Так я получаю проекты обратно (ProjectTypes - это Enum):

var filter = Builders<Project>.Filter.Eq(x => x.ProjectType, (int)ProjectTypes.Activity);
var projects = _mongoDbContext.Projects.Find(filter).ToList();

Потенциальный ответ

Похоже, использование аннотации [BsonDateTimeOptions(Kind = DateTimeKind.Local)] для этой проблемы.

public class Project
{
   ...

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

   ...
}

Как предложили @Prasad и @Kit.

1 Ответ

1 голос
/ 04 февраля 2020

это происходит потому, что драйвер преобразует DateTimes в UT C перед сохранением в БД. см. исходный код здесь

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

например, при создании записи вы делаете это:

    CreationDate = new DateTime(2020, 02, 03)

    //this is not neccessary as the driver takes care of the conversion
    CreationDate = new DateTime(2020, 02, 03, 0, 0, 0, DateTimeKind.Utc)

и на презентации вы делаете это:

    project.CreationDate.ToLocalTime()

, если ваш уровень представления представляет собой некоторую js среду вы отправляете данные в веб-приложение в формате ut c и javscript преобразует их в местное время пользователя при отображении.

причина иметь дело с UT C только в коде приложения, потому что даже если в будущем ваш код будет работать на нескольких компьютерах в нескольких регионах, ваш код будет связан только с одним часовым поясом. переход на местное время является обязанностью логики представления c.

...