0

我有一个用 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 对象存储日期字段而不遇到夏季和默认时间问题的最佳方法是什么?

在 C# 中存储具有以下格式的 ISODate 更好吗?

{ 
    "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);

非常感谢您的帮助。非常感谢。

问候

4

1 回答 1

0

MongoDB 使用 Bson 日期,它不会在日期内存储时区 -

官方 BSON 规范将 BSON 日期类型称为 UTC 日期时间。

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

ISODate("2015-10-25T01:41:15.469+01:00")只是一个 javascript 帮助器方法,允许您在 ISODate 和 BsonDate 之间进行转换,因此字符串中的偏移量只是更改为转换回 UTC 时间。

如果您需要时区或偏移量,则需要手动将其存储在文档中,并在反序列化后将其转换回来。

于 2015-10-27T22:40:24.727 回答