2012-04-24 43 views
0

我有一个朋友有搞清楚如何显示日期时间,从多个时区的用户,其困难的日期时间显示,而无需调整自己的时区的日期。例如,假设他在每个亚利桑那加州内华达一个服务器状态的适当的时区。如果用户保存一条记录,如上午9:00 AM Arizona Arizona时间,他希望它在加利福尼亚内华达服务器上显示为上午9:00时显示给用户。我相信数据库是SQL Server 2008。存储和从多个服务器在不同的时区

他怎么能去这样做呢?我将假定它与UTC日期时间值有关?无论如何,我会很感激他对如何做到这一点,因为我们似乎无法达成一致,我可以告诉他感到沮丧一个“完整”的例子......

提前感谢!

回答

3

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

我不相信存储或检索数据时 SQL Server将实际执行任何时区转换,但它可能是值得你的朋友明确地做出那种“未指定”取回后用DateTime.SpecifyKind。这可以在以后为他解决问题。

可能使用UTC无处不在 - 但它听起来像它不是真的一个 UTC日期/时间......这是一个“本地时间无论你在哪里”,这是完全不同的。作为你的朋友想要的是一个LocalDateTime - -

当然,这将是我的疏忽何况在这一点上我自己的Noda Time的项目有一个合理的设定的日期/时间类型使得容易保持所有这一切都在你的代码中。我建议你的朋友在数据库代码本身以外的任何地方都使用野田时间 - 你可以使用ToDateTimeUnspecifiedLocalDateTime转换为DateTime,并用FromDateTime转换另一种方式。

您和您的朋友不妨阅读core conceptstype choices页更引人深思 - 不管你用野田佳彦时间与否,它有望使你更加仔细地考虑了各种可用的日期/时间。那么你可以阅读我的rant against DateTime如果你还没有确信:)

+0

我会通过这一点给我的朋友。我认为你是对的SQL Server不执行任何转换。谢谢! – Gup3rSuR4c 2012-04-24 18:20:49

+0

嗯,我没有听到我的朋友回来,但我相信你的知识,所以我会接受你的答案。 – Gup3rSuR4c 2012-04-25 22:54:08

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_tz功能的SQL Server 2008可以存储UTC时间和服务器配置的时区,你将能够执行到服务器时间的转换。

SELECT convert_tz(table.UtcTime, 'UTC', table.TimeZone) FROM table 
相关问题