【问题标题】:Storing DateTime consistently on server and client在服务器和客户端上一致地存储 DateTime
【发布时间】:2014-07-14 13:59:03
【问题描述】:

在开发应用程序时,我遇到了客户端和服务器之间的时间一致性问题。让我先描述一下应用程序。使用实体框架 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 存储日期 - 这是主要思想。

【问题讨论】:

    标签: c# javascript entity-framework date


    【解决方案1】:

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

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

    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作为您要显示的字符串,并让视图代码按原样显示它而不解析它。

    【讨论】:

    • 也许我误解了你的意思,但这样我们将在设置时区服务器中呈现日期,而不是在客户端机器上设置的那个。所以在我看来,这应该在客户端完成。但同样,这是例行的手工工作。
    猜你喜欢
    • 2013-06-08
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多