【问题标题】:NHibernate / SQLite timezone problem with DateTime data type -- off by timezone offset error日期时间数据类型的 NHibernate / SQLite 时区问题 - 时区偏移错误关闭
【发布时间】:2020-07-05 12:10:04
【问题描述】:

即使我明确指定我想在 UTC 中执行所有操作,但我的 DateTime 值在某处表现得好像它们在本地时间作为字符串写入 SQLite DB,没有时区指定,然后读回,就好像那些相同的数字是 UTC 时间一样。由于我的本地时区目前是 UTC-0400,这意味着我正在读取保存的时间,就好像它比应该的时间早了四个小时。

DateTime 值的定义如下:

    public class OrderModel
    {
        ...
        public virtual DateTime ReceivedTime { get; set; }
        ...

此值的映射如下所示:

            {
                map.Column("RECEIVED_TIME");
                map.Type<NHibernate.Type.UtcDateTimeType>();
            });

我必须制作一个人为的示例来简化正在发生的事情,有趣的是,在使用同一个会话时问题没有出现。我必须在一个会话中写入数据,然后在问题出现之前从另一个会话中读取它。

    var sessionFactory = new TestSessionFactory();
    var session = sessionFactory.OpenSession();
    var transaction = session.BeginTransaction();
    var now = DateTime.UtcNow;
    var time1 = now.ToString("u");
    session.Save(new OrderModel() { ReceivedTime = now });
    transaction.Commit();
    session.Dispose();
    session = sessionFactory.OpenSession();
    var time2 = session.Query<OrderModel>().First().ReceivedTime.ToString("u");
    Console.WriteLine(time1 + ", " + time2);

上述代码的输出是:2020-03-24 22:13:00Z, 2020-03-24 18:13:00Z

相同的时间值...除了 4 小时的错误。

我错过了什么?到目前为止,我已经做了很多寻找答案的工作,但没有任何迹象表明我应该需要更多的设置。我读过其他人有类似的问题(但是从很多年前开始),并决定制作自己的自定义数据类型来解决问题——这对于应该像日期时间值。

【问题讨论】:

标签: c# sqlite linq .net-core nhibernate


【解决方案1】:

我的老板想出了这个解决方法:将DateTimeKind=Utc 添加到连接字符串中。

我自己发现了类似的东西,但不完全相同(我想像 Timezone=UTC 这样的东西)并没有帮助,但 DateTimeKind=Utc 完成了这项工作。

【讨论】:

    猜你喜欢
    • 2021-12-19
    • 1970-01-01
    • 2016-07-28
    • 2018-03-15
    • 1970-01-01
    • 2021-09-25
    • 2014-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多