2008-09-23 71 views
8

我的数据库位于加利福尼亚。 我的用户表拥有所有用户的时区,例如-0700 UTC日期时间调整

无论何时我向居住在用户身上的用户显示日期,我如何从我的数据库服务器调整时间。纽约? UTC/GMT -4小时

回答

4

您应该以UTC格式存储数据并以本地时区格式显示。

DateTime.ToUniversalTime() -> server; 
DateTime.ToLocalTime() -> client 

您可以使用AddXXX方法组调整日期/时间,但它可能容易出错。 .NET支持System.TimeZoneInfo类中的时区。

0

直到.NET 3.5(VS 2008),.NET除了转换UTC和UTC之外,还没有任何对时区的内置支持。

如果时间差始终是所有一年之久(夏季和冬季)正好3个小时,只需使用yourDate.AddHours(3)改变的一种方式,并yourDate.AddHours(-3)将它改回来。一定要把这个分解成一个函数,解释这3个小时增加/减少的原因。

0

你可以使用TimeZoneInfo.GetSystemTimeZones的组合(),然后使用TimeZoneInfo.BaseUtcOffset财产折价时间的基础上的偏移差数据库

信息上System.TimeZoneInfo here

0

你知道,这是一个很好的问题。今年我已经完成了我的第一个数据库应用程序,并且由于与时间相关的输入数据是Int64值,这就是我在数据库中存储的数据。我的客户端应用程序检索它并对该值执行DateTime.FromUTC()或FromFileTimeUTC(),并执行.LocalTime()以在当地时间显示事物。我想知道这是否好/坏/可怕,但迄今为止我的需求已经足够好了。当然,这项工作最终将由我编写的数据访问层库完成,而不是在数据库本身。

似乎工作得不错,但我相信其他有这方面经验的人可能会指出这不是最好的方法。

祝你好运!

2

如果使用.Net,则可以使用TimeZoneInfo。既然你用'c#'标记了这个问题,我会假设你这样做。

第一步是获取想要转换为的时区的TimeZoneInfo。在你的例子中,纽约的时区。这里有一种方法可以做到这一点:

//This will get EST time zone 
TimeZoneInfo clientTimeZone 
    = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); 

//This will get the local time zone, might be useful 
// if your application is a fat client 
TimeZoneInfo clientTimeZone = TimeZoneInfo.Local; 

然后,您从您的数据库读取DateTime后,您需要确保其Kind设置正确。假设该DateTime的在DB是UTC(顺便说一句,这是通常建议),你可以准备它转换这样的:

DateTime aDateTime = dataBaseSource.ReadADateTime(); 
DateTime utcDateTime = DateTime.SpecifyKind(aDateTime, DateTimeKind.Utc); 

最后,为了转换为不同的时区,简单地做到这一点:

DateTime clientTime = TimeZoneInfo.ConvertTime(utcDateTime, clientTimeZone); 

一些额外的言论:

  • TimeZoneInfo可以存储在静态字段,如果你只在少数特定时间段感兴趣;
  • TimeZoneInfo存储有关夏令时的信息。所以,你不必担心这一点。
  • 如果你的应用程序是网页,找出你的客户端在哪个时区可能很难。一种方法是在这里解释:http://kohari.org/2009/06/15/automagic-time-localization/

我希望这有助于。 :)

+0

这应该被接受为答案 – 2012-05-05 18:11:30