0

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

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

提前致谢!

4

2 回答 2

3

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

我不相信DateTime.SpecifyKindSQL Server 在存储或检索数据时实际上会执行任何时区转换,但可能值得你的朋友在检索后明确使用“未指定”类型。这可以为他以后解决问题。

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

当然,在这一点上不提我自己的Noda Time项目是我的疏忽——正如你的朋友想要的那样LocalDateTime——拥有一组合理的日期/时间类型可以容易地在你的代码中保持所有这些. 我建议您的朋友在除了数据库代码本身之外的任何地方都使用 Noda Time - 您可以将 a 转换LocalDateTimeDateTimeusingToDateTimeUnspecified并使用FromDateTime.

您和您的朋友可能希望阅读核心概念类型选择页面以获取更多思考——无论您是否使用 Noda Time,它都有望让您更仔细地考虑可用的日期/时间类型。如果您仍然不相信,那么您可以阅读我的咆哮:)DateTime

于 2012-04-24T18:09:34.687 回答
0

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

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 时间,您可能需要查看convert_tzSQL Server 2008 的等效功能。您可以存储 UTC 时间和服务器配置的时区,您将能够执行转换到服务器的时间。

 SELECT convert_tz(table.UtcTime, 'UTC', table.TimeZone) FROM table
于 2012-04-24T18:06:53.713 回答