如何关闭 MongoDB 的 UTC 时区

How can I turn UTC Timezone off for MongoDB

由于 MongoDB stores times in UTC by default.,我将下面的扩展用于 MongoDB 日期字段

    public static class DateTimeExtensions {
    
        public static DateTime AdjustUtcDiffByOffset(this DateTime time) {
            return time.AddHours(DateTimeOffset.Now.Offset.Hours);
        }
    }
}
尽管我在 .NET 中的应用程序级别上尝试了一些方法,例如属性或序列化方法,但它们都会导致不同的问题。我现在决定在 .NET 中使用这个扩展,但我认为这也不是一个完整和准确的解决方案。

是否有针对此问题的任何解决方案在数据库级别而不依赖于带有调整或其他东西的编程语言?

编辑

我认为我应该在下面的评论后进行更多解释。我已经知道 MongoDB 以 UTC 格式存储时间,正如您在上面看到的那样,链接在此 post 中。这可能很有用,但我的应用程序不需要任何 UTC 时区差异,而且我不想分别处理每种编程语言的表示层。而且,我什至不希望在其他层中只需要一个额外的行或功能,因为比基本逻辑或业务更远。

让我的架构承担这件事。我很懒惰,生命真的很短暂,鸟儿在外面飞翔:) 我不希望不同的领域像字符串转换一样不必要。由于我在应用程序中进行了多次时间计算,因此我需要数据库中的日期时间类型。

我现在使用 .NET,因此 MongoDB .NET driver。我尝试了不同的序列化方法,但它在数据访问体系结构中引起了另一个问题。 总之,我可以在我的另一个应用程序中使用 UTC,但我现在不想要它,我更喜欢分配给字段时的本地时间。我决定特别对C#使用下面的封装。

    private DateTime _startTime;
    public DateTime StartTime {
        get => _startTime;
        set => _startTime = new DateTime(value.Ticks, DateTimeKind.Utc);
    }

我认为从数据库级别来看是不可能的。我所做的是为日期属性编写自定义 setter,这将强制 mongoDB 假设时间已经在 UTC 中,从而避免如下所示的转换:

private DateTime _createdUTC;
public DateTime CreatedUtc
  {
     get
       {
         return _createdUTC;
       }
     set
       {
         _createdUTC = new DateTime(value.Ticks, DateTimeKind.Utc);
       }
  }

MongoDB 始终以 UTC 格式保存日期。

你可以做的就是告诉客户,他从数据库中检索数据时必须将日期转换为本地日期。

您可以在实例化客户端之前注册序列化程序:

BsonSerializer.RegisterSerializer(DateTimeSerializer.LocalInstance);
var client = new MongoClient(options) ...