【问题标题】:BsonDateTimeOptions doesn't set local datetimeBsonDateTimeOptions 不设置本地日期时间
【发布时间】:2019-12-22 23:56:12
【问题描述】:

虽然我用 BsonDateTimeOptions 装饰了我的 Datetime 属性,但它仍然无法正常工作并且时间插入到数据库中,比我的当地时间晚了 3 小时。(我认为它是 UTC)
我的基础抽象类

public abstract class MongoBaseModel
{
    public ObjectId Id { get; set; }

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

我的实体

public class RockSongs:MongoBaseModel
{
    [BsonElement("Name")]
    public string Name { get; set; }

    [BsonElement("Singer")]
    public string Singer { get; set; }
}

数据库版本 v4.2.1

MongoDb.Driver 2.7.2

【问题讨论】:

    标签: c# mongodb asp.net-core mongodb-.net-driver


    【解决方案1】:

    根据documentation

    默认情况下,MongoDB 以 UTC 存储时间,并将任何本地时间表示形式转换为这种形式。必须对某些未修改的本地时间值进行操作或报告的应用程序可以将时区与 UTC 时间戳一起存储,并在其应用程序逻辑中计算原始本地时间。

    序列化方面,DateTimeKind.LocalDateTimeKind.Utc 没有区别。在这两种情况下,您的 .NET DateTime 都将存储为 UTC。这个属性变得有用的时刻是反序列化。如果您应用DateTimeKind.Local,MongoDB .NET 驱动程序会自动将您的 UTC 日期时间转换为您本地计算机的时区。

    MongoDB 将日期存储为 UTC 的事实直接来自 BSON 规范。

    【讨论】:

    • 所以没有可能将其作为当地时间存储到数据库中?
    • @erhan355 基本上我不会推荐。存储在数据库中的日期时间应该与客户端无关,并且“本地时间”应该在客户端计算。请查看链接示例,其中建议将偏移量存储为单独的字段,以便您的客户端应用程序可以轻松转换为本地时间。
    • @erhan355 就像 mickl 说的,你不应该将本地时间存储在数据库中,但如果你真的必须,看看我写的custom date serializer。您可以更改第 26 行和第 40 行以摆脱对 utc 的转换。
    • @Ryan Gunner 我部分同意。在某些情况下,我认为您确实需要它。想象一下,我有一个记录传感器值并将其插入云的 Web 应用程序。其他云服务会定期获取数据以及何时获取数据超过任何传感器阈值它会发送一封邮件,其中包含超过阈值的时间戳。在这种情况下,日期时间区将始终是云服务的时区,客户将收到日期时间错误的邮件。我错了吗?
    • @erhan355 当涉及多个时区时,最好将其存储为 utc 并在向用户显示时将其转换回用户的本地时间。为此,您必须知道用户的时区并像 this 一样进行转换。
    猜你喜欢
    • 1970-01-01
    • 2010-12-10
    • 2018-06-13
    • 2014-05-31
    • 1970-01-01
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多