c# - 在服务器和客户端上一致地存储 DateTime

标签 c# javascript entity-framework date

在开发应用程序时,我遇到了客户端和服务器之间的时间一致性问题。让我先描述一下应用程序。使用 Entity Framework ORM(MS SQL 服务器用作数据库引擎)(代码优先方法)。在客户端页面上,我有一个接受日期和时间的简单表单。当我想提交表单并发送数据时,接下来的步骤将发生:

  • 用户按下提交(日期存储为 javascript 日期对象,因此具有当前用户时区)
  • 包含所有要发送的表单数据(包括日期和时间)的对象被序列化为 JSON。 JSON.Stringify 的作用是将日期对象转换为该日期的字符串表示形式,但格式为 UTC。该日期存储在数据库中。
  • 当用户请求此数据时,返回一个 JSON 字符串;但是服务器以正常格式(不是 UTC)返回日期。 JSON.parse 不会将表示日期的字符串转换为 javascript 对象。所以当我解析一个日期时,我得到了错误的值。

示例:假设用户输入 05/25/2014 22:20:00,其时区偏移量为 GMT +3。现在用户提交的表单日期将转换为 UTC:05/25/2014 19:20:00,并将其保存到数据库中。然后用户请求数据并得到错误的日期和时间 - 19:20:00。

我意识到我可以通过在客户端手动解析日期来实现正确处理。但是有什么方法可以通过以下方式提供日期的一致性:

  • 告诉 EF 将日期视为 UTC 并以 UTC 格式返回它
  • 告诉 JSON 反序列化器解析日期

我认为这将提供日期一致性。当然,我想以 UTC 格式存储日期 - 这是主要想法。

最佳答案

我认为这是 DateTimeJSON.parse 问题的结合,而不是来自 EF。

因为您知道您将日期作为 UTC 存储在数据库中,并且我们知道网络服务器在检索时自动将 DateTimes 转换为“本地”类型的时区,也许您可​​以将 DateTime 转换回 UTC,然后再将其作为 JSON 字符串返回。

var dateTimeToReturn = TimeZoneInfo.ConvertTimeToUtc(theDateTimeRetrievedFromTheDB, TimeZoneInfo.Local)).ToString(); // or one of the other string conversion methods/formatting provided by DateTime, in the form you want displayed to the user

然后返回 dateTimeToReturn 作为你想要显示的字符串,让 View 代码按原样显示它而不解析它。

关于c# - 在服务器和客户端上一致地存储 DateTime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23859203/

相关文章:

c# - 使用 FileSystemWatcher 监视文件系统

c# - 在 C# 中,如何在不破坏编码的情况下将网页保存到文件?

javascript - 原生 JS Promise 重试包装器

javascript - 需要一个JS返回下拉菜单中的h5值

c# - MvcMiniProfiler 无法转换类型为 EFProfiledDbConnection 的对象

entity-framework - 集成测试 Entity Framework - 只为 PROD 分离种子方法调用 -

c# - ElasticSearch 和 Nest 过滤不起作用

c# - 保留笔的大小?

javascript - 将相邻重复值分组到数组中的最佳方法

c# - Entity Framework : Migration classes missing from list of pending explicit migrations after moving them to the migrations folder