【问题标题】:Time zone aware asp.net website for events: UTC vs local datetime时区感知 asp.net 事件网站:UTC 与本地日期时间
【发布时间】:2012-04-20 06:21:09
【问题描述】:

我正在开发一个 asp.net 网站,该网站的客户创建活动,用户注册这些活动。在阅读了大量关于如何存储和显示日期时间的主题之后,我仍然对采取哪条路线感到困惑。

最被接受的解决方案(在搜索主题之后)是将所有内容存储在 UTC 中并减去客户端的时区偏移量以进行显示。另一种方法是将日期时间存储在事件的时区(事件的本地时间,而不是服务器),并在请求时将其按原样显示给客户端。那不是更有效率吗?我错过了什么吗?是否这样考虑夏令时?

提前致谢。

【问题讨论】:

  • 从长远来看,将 UTC 用于应用程序中的所有时间戳并根据用户时区进行调整会容易得多

标签: asp.net datetime timezone utc


【解决方案1】:

以 UTC 存储所有内容是有原因的标准。

您将事件存储在当地时间的替代方案会导致不同时区的用户对事件实际发生的时间感到困惑。

【讨论】:

  • 您说得对,杰夫,但既然一个事件属于一个客户而不是全部,那为什么会引起混乱呢?在显示事件的开始时间时,假设显示的时间是当地时间是不是不合逻辑?
  • 日期时间通常显示在与客户端相同的时区。例如,我在 EST,所以我通常在论坛等中看到的所有日期都以 EST 显示给我。
  • 最简单的翻译方法是捕获UTC中的时间戳,然后将其翻译为客户端的时区。因此,在我的示例中,我看到的所有时间戳都是 UTC -5 小时。
  • 我明白你的意思,但我认为这里的情况不同。例如,美国公民想参加在英国举行的活动。我相信他们应该看到事件发生的当地时间。不是他们的。我错了吗?
  • 是的,就是这样。每个事件都有自己的时区,并在保存注册后将注册的日期时间转换为事件的时区(本地时间)。在实践中,我想我必须为每个事件存储与 UTC 的偏移量,然后使用它来计算每个注册的本地时间。
【解决方案2】:

使用事件的位置时区作为参考点,我们可以这样做来获取当前的本地时间(在 .NET 3.5 或 4.0 中):

string EventTimeZoneId = "GTB Standard Time"; // for instance, this should be stored in DB as varchar[32]
DateTime EventLocalTime = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTime.UtcNow, EventTimeZoneId);

这也考虑了夏令时。我能想到的唯一缺点是,如果客户端在创建事件时选择了错误的时区,那么所有注册都会有错误的时间。

【讨论】:

    【解决方案3】:

    如果你使用的是 c# asp.net

    1. 存储在数据库中

    DateTime CurrntDate= DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Unspecified);变量 _utc = TimeZoneInfo.ConvertTimeToUtc(CurrntDate, TimeZoneInfo.Local);

    1. 从数据库中获取日期并根据客户端时区进行转换并显示。

    它将使您的业务逻辑保持一致。

    【讨论】:

    • 我明白你的意思苏尼尔。谢谢。顺便说一下转换函数应该是TimeZoneInfo.ConvertTimeToUtc(CurrntDate, TimeZoneInfo.Local);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-13
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 2012-10-29
    • 2011-08-05
    相关资源
    最近更新 更多