【问题标题】:Date value is getting changed when saving to database保存到数据库时日期值正在更改
【发布时间】:2020-01-18 22:24:36
【问题描述】:

我正在使用 Entity Framework Core 将两个日期时间变量保存到 SQL 数据库(托管在 Azure 中)表中。不知何故,当我在保存后查询数据库时,我注意到日期时间值发生了变化。您可以在下面看到保存之前的初始值。

Code with values pinned

保存后在数据库中显示如下

SQL Table values

我通读了几份技术文档,以找出可能对此产生影响的因素。尽管如此,我还是没有发现任何有趣的东西。

能否请您帮助我了解这种数据更改背后的原因?我很确定没有任何存储过程或任何其他脚本可以更改这些日期。

// step 3: update tblStudent
var tblStudentEntityToUpdate = await _applicationDbContext.Value.StudentApplications.FirstOrDefaultAsync(x => x.StudentID == vm.StudentID);
vm.GuardianID = guardianId;

_applicationDbContext.Value.Entry(tblStudentEntityToUpdate).CurrentValues.SetValues(vm);
await _applicationDbContext.Value.SaveChangesAsync();

【问题讨论】:

  • 您保存的 DateTime 似乎将 .Kind 设置为 .Local。根据第二个屏幕截图中的标记,您在 AEST 的澳大利亚,Azure 正在将其转换为 UTC,减去 10 小时。
  • 是的,你是对的。我在澳大利亚。我应该如何避免这种自动转换?我没有使用 Azure 的经验
  • 以 UTC 格式存储日期?这基本上是相同的日期/时间。

标签: c# sql-server date datetime entity-framework-core


【解决方案1】:

正如 zaitsman 在他的评论中提到的那样,原因是您正在使用本地格式的 DateTimes。无论选择哪个数据中心位置,您的 SQL Azure 服务器都设置为 UTC 时区。 AFAIK 这无法更改。

始终建议将 DateTimes 存储为 UTC,因为这样可以避免您在本地时间写入然后使用不同的时区假设读取它的任何问题。

据我了解,您的应用程序应该可以正常工作,因为您的应用程序会读回这些值并将它们正确存储为 UTC 日期时间,然后如果您想在某个时区显示此信息,您可以调用 DateTime.ToLocalTime .

【讨论】:

  • 这总是很痛苦 - 问题是虽然它“工作正常”但你会遇到各种各样的问题。例如,如果您正在分析数据,并想知道下午 5 点到 6 点之间发生了什么,这将是一个不同的时间,具体取决于您是否恰好处于夏令时。如果它是一个单一的时区应用程序,您实际上并不关心 UTC 时间是多少,您希望下午 5 点始终是当地时间下午 5 点,即使夏天下午 5 点会发生变化。
猜你喜欢
  • 2016-01-15
  • 2017-04-13
  • 1970-01-01
  • 1970-01-01
  • 2019-10-30
  • 2017-06-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多