【问题标题】:Workflow suggestion for handling time zones处理时区的工作流程建议
【发布时间】:2012-10-22 05:07:54
【问题描述】:

为了概述我的项目,我有一个 ASP.NET WebForm 应用程序,它允许用户登录并安排活动。事件处理由我为其编写 Windows 服务的本地 Windows 服务器处理和分派。

一切正常,除了我有一些从东海岸登录的客户和一些从西海岸登录的客户。

有人可以就我如何处理时区差异提出一个可能的工作流程吗?时区信息已与每个客户端一起存储在数据库中。 我只是对如何应用时区信息感到困惑。

我知道 DateTime 有一个 ToUniversalTime() 方法,但它让我对它的工作原理感到困惑,因为它似乎需要知道 DateTime 结构所在的时区才能将其转换为通用时间,据我所知,DateTime 结构中没有内置时区信息。

谁能给我解释一下?

【问题讨论】:

  • wall'o'文本?你能试着用一两段来让这篇文章更容易阅读吗?

标签: c# asp.net timezone timezone-offset


【解决方案1】:

如果事件计划发生一次,则将其存储为 DateTimeOffset 或 UTC DateTime 是有意义的。如果您将其存储为 DateTimeOffset,您仍然可以将其显示给具有相关偏移量的用户 - 实际上您可以将其显示给 other 时区的人们作为他们的当地时间,或者作为原始用户的本地时间,并带有一个指示符,表明它与查看者的本地时间不同(如果你明白我的意思的话)。

如果它是经常性的(例如“每天凌晨 4 点”),那么这还不够,因为它不会考虑 DST 的变化。相反,您应该存储 本地 时间和时区标识符。请参阅TimeZoneInfo.IdTimeZoneInfo.FindSystemTimeZoneById

作为一个公然的插件,您可能希望考虑使用 Noda Time API 作为内置类型的更具表现力的替代方案...

您几乎可以肯定使用DateTime.ToUniversalTime(),因为它使用系统时区(即在您的服务器上),这几乎肯定是无关紧要的。

【讨论】:

    【解决方案2】:

    来自MSDN

    ToUniversalTime 方法从本地时间转换 DateTime 值 到 UTC。要将非本地时区的时间转换为 UTC,请使用 TimeZoneInfo.ConvertTimeToUtc(DateTime, TimeZoneInfo) 方法。到 转换与 UTC 的偏移量已知的时间,使用 ToUniversalTime 方法。

    从 .NET Framework 2.0 版开始,返回的值由 ToUniversalTime 方法由 当前的 DateTime 对象。

    未指定 DateTime 上 Kind 的默认值,因此您的日期将被假定为当地时间。

    【讨论】:

      【解决方案3】:

      我们一直在开发类似的应用程序。我们将 TimeZoneOffset 和 Scheduled Time 存储在数据库表中。在客户端,TimeZOneOffset(以分钟为单位)考虑了夏令时。计算如下:

          Dim localZone As TimeZone = TimeZone.CurrentTimeZone 
          Dim StartTime As DateTime = UserEnteredStartDateTime 'from your web app
          Dim TimeZoneOffset As Integer = localZone.GetUtcOffset(StartTime).TotalMinutes
      

      服务器上的存储过程包括一个 where 子句,它选择在预定开始时间加上 30 秒窗口内的行,如下所示:

      SELECT Invitations.ID, Invitations.OrganizerName, Invitations.OrganizerEmail, Invitations.EMailBody, Invitations.[Subject]
      FROM Invitations 
      WHERE (Invitations.MailSent=0) 
      And (Invitations.SendTime Between DateAdd(mi,Invitations.TimeZOneOffset,GETUTCDATE()) 
      And DateAdd(s,(Invitations.TimeZoneOffset*60)+30,GETUTCDATE())) 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-13
        • 2021-02-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多