【问题标题】:Handle time change (summer- and default time) in MongoDB with C# driver使用 C# 驱动程序在 MongoDB 中处理时间更改(夏季和默认时间)
【发布时间】:2015-10-26 21:09:43
【问题描述】:

我有一个用 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);

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

问候

【问题讨论】:

  • 你能澄清一下你有什么“夏季和默认时间的问题”吗? ISO 8601 不支持命名时区(如 PDT/PST) - 所以你真的需要知道特定的时间/空间时刻是否在夏季,或者你是否需要以不同的方式存储该信息。
  • 非常感谢。当服务在当地时间上午 12 点存储文档时,MongoDB 将其存储为 UTC 时间。这意味着,在白天,该值将是上午 10 点(我们有 UTC+01:00),而在标准时间是上午 11 点。这很好,但如果我必须通过集合进行查询,似乎我总是必须知道 UTC 时间。有没有一种简单的方法可以查询当地时间?另一个问题是在时间变化期间。从白天到标准时间,我两次收到一些文件,因为“SourceTime”字段回溯了 1 小时。因此,我认为在 SourceTime 中添加“+01:00”或“+02:00”可以解决。

标签: c# mongodb utc isodate


【解决方案1】:

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 时间。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    • 2021-03-27
    • 2023-01-29
    • 2021-03-09
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多