【发布时间】:2021-02-13 10:15:58
【问题描述】:
我有一个包含 DateTime 属性的类。如何使用 Entity Framework Core 正确节省时间?下面我举个例子。
我使用 TIMESTAMP 格式将 DateTime 存储在数据库中。我有一个时区 +3(莫斯科)的服务器和数据库(MySQL)。
SELECT TIMEDIFF(current_timestamp(), utc_timestamp()); // result = 03:00:00
我还有一个可以在不同用户的PC上运行的程序。程序将包含 DateTime 属性的对象保存在数据库中:
obj.DateTime = DateTime.Parse("2020-10-13T19:00:00+0300");
现在我们来看几种情况:
-
程序在时区 +3(莫斯科)
的 PC 上启动Console.WriteLine(obj.DateTime?.ToString()); // 2020-10-13 19:00:00
我使用 phpMyAdmin 检查数据库中的数据,我看到 2020-10-13 19:00:00。一切都好。 PC的时区等于数据库的时区,所以我们看到的结果是一样的。
-
程序在+6:30(仰光)时区的PC上打开
Console.WriteLine(obj.DateTime?.ToString()); // 13.10.2020 22:30:00
我使用 phpMyAdmin 检查数据库中的数据,我看到 2020-10-13 22:30:00。 失败! 我应该在 19:00 而不是 22:30 同时看到所有内容。 obj.DateTime 属性包含相同的时间!
我现在如何理解这些记录包含相等时间?为什么 EF 不将 DateTime 转换为 UTC?
【问题讨论】:
-
服务器的时区是固定的,您可以从用户计算机上获取时区信息,现在您可以在保存前更正它。当然反之亦然
-
如果您在服务器上保留 UTC 时间,然后在访问服务器(读取或写入)时应用本地时区特定的更正,您可能会发现这更容易。您可能还想查看 Noda Time (nodatime.org)。它消除了很多 .NET 的时间怪异
标签: c# mysql datetime entity-framework-core