【问题标题】:Storing and Displaying DateTime from Multiple Servers in Different Time Zones存储和显示来自不同时区的多个服务器的日期时间
【发布时间】:2012-05-05 09:57:35
【问题描述】:

我有一个朋友在弄清楚如何向来自多个时区的用户显示 DateTime 时遇到困难,但没有针对他们的时区调整日期。例如,假设他在 ArizonaCaliforniaNevada 有一个服务器,每个服务器都有相应的州时区。如果用户将记录保存为 Arizona 上午 9:00,他希望它在 加利福尼亚内华达 显示为上午 9:00 em> 服务器,当它显示给他们的用户时。数据库是 SQL Server,我相信是 2008。

他怎么能这样做呢?我将假设它与 UTC DateTime 值有关?无论如何,我很感激他如何做到这一点的“完整”示例,因为我们似乎无法达成协议,我可以看出他感到沮丧......

提前致谢!

【问题讨论】:

    标签: c# .net sql-server


    【解决方案1】:

    听起来您的朋友可以直接将时间存储在 SQL 中。例如,如果加利福尼亚和亚利桑那州的两台服务器在当地时间晚上 9 点运行以下查询,则会插入两个 9pm 值。

    SqlCommand cmd = new SqlCommand("INSERT INTO table (Date) VALUES (@value)", conn);
    cmd.Parameters.AddWithValue("@value", DateTime.Now.ToString("yyyy-mm-dd hh:mm:ss"));
    cmd.ExecuteNonQuery();
    

    如果您希望插入 UTC 时间,您可能需要查看 SQL Server 2008 的等效 convert_tz 功能。您可以存储 UTC 时间和服务器配置的时区,您将能够执行到服务器时间的转换。

     SELECT convert_tz(table.UtcTime, 'UTC', table.TimeZone) FROM table
    

    【讨论】:

      【解决方案2】:

      听起来他们真正输入的是本地时间,没有真正参考任何特定时区。这最接近DateTimeKind.Unspecified 的行为(不是本地的,这意味着“在服务器的本地时区”,这是另一回事)。

      我不相信 SQL Server 在存储或检索数据时实际上会执行任何时区转换,但可能值得您的朋友在检索后使用DateTime.SpecifyKind 明确地“未指定”类型.这可以为他以后避免麻烦。

      可以在任何地方都使用 UTC - 但听起来它不是 真正 UTC 日期/时间......这是一个“无论你身在何处的本地时间”,这完全是不同。

      当然,在这一点上不提我自己的Noda Time 项目当然是我的疏忽——因为你的朋友想要的是一个LocalDateTime——拥有一组合理的日期/时间类型使得它 更容易将所有这些直接保存在您的代码中。我建议你的朋友在除了数据库代码本身之外的任何地方都使用 Noda Time - 你可以使用 ToDateTimeUnspecifiedLocalDateTime 转换为 DateTime 并使用 FromDateTime 转换另一种方式。

      您和您的朋友不妨阅读core conceptstype choices 页面以获取更多思考 - 无论您是否使用 Noda Time,它都有望让您更仔细地思考可用的日期/时间类型.如果您仍然不相信,可以阅读我的rant against DateTime :)

      【讨论】:

      • 我会把这个传给我的朋友。我确实认为您对 SQL Server 不执行任何转换是正确的。谢谢!
      • 好吧,我还没有收到我朋友的回复,但我相信你的知识,所以我会接受你的回答。
      猜你喜欢
      • 1970-01-01
      • 2018-01-31
      • 2018-05-08
      • 2019-07-05
      • 1970-01-01
      • 2014-07-30
      • 1970-01-01
      • 2013-09-30
      相关资源
      最近更新 更多