Обработвайте промяната на времето (лятно време и време по подразбиране) в MongoDB с C# драйвер

Имам централизирана услуга за регистриране, написана на C#. Тази услуга получава записи в журнал (в JSON низ) и ги добавя в колекция MongoDB. Използвам официалния C# MongoDB драйвер и MongoDB версия 3.0.

Да приемем, че имам документ с тази основна структура (и пример):

{
    "_id" : ObjectId("562c2785a075b738c484ad99"),
    "Service" : "WebServer A",
    "Description" : "User has logged in",
    "SourceTime" : ISODate("2015-10-25T00:41:15.469Z")
}

Както можете да видите в този документ, имам поле за дата, наречено "SourceTime". Този UTC формат не ми казва дали документът е създаден през лятото (+02:00) или по подразбиране (+01:00).

Бих искал да ви попитам кой е най-добрият начин да съхраните поле за дата с обект ISODate, без да имате проблеми с лятното време и часовото време по подразбиране?

По-добре ли е да съхранявате ISODate със следния формат в C#?

{ 
    "SourcTime" : ISODate("2015-10-25T01:41:15.469+01:00") 
} 

Ако да, някой има ли пример как да се постигне това с C#?

В момента добавям следния документ:

    // parse String _document to a BsonDocument
    BsonDocument document = BsonDocument.Parse(_document);

    // Change SourceTime field to a DateTime object
    var TimeElem = document.GetElement("SourceTime").Value.ToString();
    DateTime newTime = DateTime.Parse(TimeElem);

    // Update document
    document.Set("SourceTime", newTime.ToUniversalTime()); // result ISODate("2015-10-25T00:41:15.469Z")

    // Add to MongoDB
    var collection = _database.GetCollection<BsonDocument>(_collectionName);
                    collection.InsertOneAsync(document);

Благодаря ви много за вашата помощ. Много го оценявам.

за разбирането


person user1885888    schedule 26.10.2015    source източник
comment
Можете ли да поясните какви проблеми с лятното часово време и часовото време по подразбиране имате? ISO 8601 не поддържа именувани часови зони (като PDT/PST) - така че наистина трябва да знаете дали определен момент във времето/пространството е бил през лятното време или не, трябва да съхранявате тази част от информацията по различен начин.   -  person Alexei Levenkov    schedule 27.10.2015
comment
Благодаря много. Когато услугата съхранява документ в 12 сутринта местно време, MongoDB го съхранява като UTC време. Това означава, че през деня стойността ще бъде 10 сутринта (имаме UTC+01:00), а през стандартното време 11 сутринта. Това е добре, но ако трябва да правя запитвания през колекцията, изглежда, че винаги трябва да знам UTC времето. Има ли лесен начин за запитване с местно време? Друг проблем е по време на смяна на часа. От дневно до стандартно време получих някои документи два пъти, защото полето SourceTime се върна 1 час назад. Затова реших, че добавянето на +01:00 или +02:00 в SourceTime може да реши проблема.   -  person user1885888    schedule 28.10.2015


Отговори (1)


MongoDB използва Bson дата, която не съхранява часовата зона в рамките на датата -

Официалната спецификация на BSON се отнася за типа BSON Date като UTC datetime.

https://docs.mongodb.org/manual/reference/bson-types/#date

ISODate("2015-10-25T01:41:15.469+01:00") е просто помощен метод на JavaScript, който ви позволява да конвертирате между ISODate и BsonDate, така че отместването в низа просто се променя, преобразувано обратно в UTC време.

Ако имате нужда от часова зона или отместване, ще трябва ръчно да ги съхраните в документа и да ги конвертирате обратно след десериализация.

person Kevin Smith    schedule 27.10.2015