我的数据库位于加利福尼亚。 我的用户表拥有所有用户的时区,例如-0700 UTC日期时间调整
无论何时我向居住在用户身上的用户显示日期,我如何从我的数据库服务器调整时间。纽约? UTC/GMT -4小时
我的数据库位于加利福尼亚。 我的用户表拥有所有用户的时区,例如-0700 UTC日期时间调整
无论何时我向居住在用户身上的用户显示日期,我如何从我的数据库服务器调整时间。纽约? UTC/GMT -4小时
您应该以UTC格式存储数据并以本地时区格式显示。
DateTime.ToUniversalTime() -> server;
DateTime.ToLocalTime() -> client
您可以使用AddXXX方法组调整日期/时间,但它可能容易出错。 .NET支持System.TimeZoneInfo类中的时区。
直到.NET 3.5(VS 2008),.NET除了转换UTC和UTC之外,还没有任何对时区的内置支持。
如果时间差始终是所有一年之久(夏季和冬季)正好3个小时,只需使用yourDate.AddHours(3)
改变的一种方式,并yourDate.AddHours(-3)
将它改回来。一定要把这个分解成一个函数,解释这3个小时增加/减少的原因。
你可以使用TimeZoneInfo.GetSystemTimeZones的组合(),然后使用TimeZoneInfo.BaseUtcOffset财产折价时间的基础上的偏移差数据库
信息上System.TimeZoneInfo here
你知道,这是一个很好的问题。今年我已经完成了我的第一个数据库应用程序,并且由于与时间相关的输入数据是Int64值,这就是我在数据库中存储的数据。我的客户端应用程序检索它并对该值执行DateTime.FromUTC()或FromFileTimeUTC(),并执行.LocalTime()以在当地时间显示事物。我想知道这是否好/坏/可怕,但迄今为止我的需求已经足够好了。当然,这项工作最终将由我编写的数据访问层库完成,而不是在数据库本身。
似乎工作得不错,但我相信其他有这方面经验的人可能会指出这不是最好的方法。
祝你好运!
如果使用.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
存储有关夏令时的信息。所以,你不必担心这一点。我希望这有助于。 :)
这应该被接受为答案 – 2012-05-05 18:11:30