日期时间时区调整
我的数据库位于加利福尼亚。
我的用户表具有所有用户的时区,例如-0700 UTC
每当我向居住在(例如)的用户显示日期时,如何从数据库服务器调整时间。纽约? UTC / GMT -4小时
解决方案
我们应该以UTC格式存储数据,并以本地时区格式显示数据。
DateTime.ToUniversalTime() -> server; DateTime.ToLocalTime() -> client
我们可以使用AddXXX方法组来调整日期/时间,但是它可能容易出错。 .NET在System.TimeZoneInfo类中支持时区。
直到.NET 3.5(VS 2008),. NET都没有对时区的任何内置支持,除了与UTC之间的转换外。
如果一年四季(夏季和冬季)的时差总是恰好3个小时,只需使用yourDate.AddHours(3)
更改一种方式,并使用'yourDate.AddHours(-3)`更改回来。请确保将此功能分解为一个功能,以说明添加/减去这三个小时的原因。
我们可以组合使用TimeZoneInfo.GetSystemTimeZones(),然后使用TimeZoneInfo.BaseUtcOffset属性根据偏移量来偏移数据库中的时间
此处有关System.TimeZoneInfo的信息
你知道,这是一个好问题。今年,我已经完成了我的第一个数据库应用程序,因为与时间相关的输入数据是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"位于UTC中(通常建议这样做),则可以准备将其转换为:
DateTime aDateTime = dataBaseSource.ReadADateTime(); DateTime utcDateTime = DateTime.SpecifyKind(aDateTime, DateTimeKind.Utc);
最后,为了转换到其他时区,只需执行以下操作:
DateTime clientTime = TimeZoneInfo.ConvertTime(utcDateTime, clientTimeZone);
一些补充说明:
- 如果我们只对几个特定的时区感兴趣,可以将TimeZoneInfo存储在静态字段中。
TimeZoneInfo
存储有关夏令时的信息。因此,我们不必为此担心。- 如果应用程序是Web,则很难确定客户所在的时区。此处说明一种方法:http://kohari.org/2009/06/15/automagic-time-localization/
我希望这有帮助。 :)