我的数据库位于例如加利福尼亚。我的用户表包含所有用户的时区,例如 -0700 UTC
每当我向居住在纽约的用户显示日期时,如何从我的数据库服务器调整时间?UTC/GMT -4 小时
您应该以 UTC 格式存储数据并以本地时区格式显示。
DateTime.ToUniversalTime() -> server;
DateTime.ToLocalTime() -> client
您可以使用 AddXXX 方法组调整日期/时间,但这很容易出错。.NET 在System.TimeZoneInfo类中支持时区。
如果您使用 .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
从数据库中读取 a 后,您需要确保其Kind
设置正确。假设DateTime
数据库中的 's 是 UTC(顺便说一下,通常建议这样做),您可以准备将其转换为:
DateTime aDateTime = dataBaseSource.ReadADateTime();
DateTime utcDateTime = DateTime.SpecifyKind(aDateTime, DateTimeKind.Utc);
最后,为了转换到不同的时区,只需执行以下操作:
DateTime clientTime = TimeZoneInfo.ConvertTime(utcDateTime, clientTimeZone);
一些额外的说明:
TimeZoneInfo
如果您只对几个特定时区感兴趣,可以将其存储在静态字段中;TimeZoneInfo
存储有关夏令时的信息。因此,您不必担心这一点;我希望这有帮助。:)
在 .NET 3.5 (VS 2008) 之前,.NET 没有任何对时区的内置支持,除了与 UTC 相互转换。
如果全年(夏季和冬季)时差总是正好 3 小时,只需使用yourDate.AddHours(3)
一种方式将其更改,然后yourDate.AddHours(-3)
将其更改回来。请务必将其分解为解释添加/减去这 3 个小时的原因的函数。
您可以使用 TimeZoneInfo.GetSystemTimeZones() 的组合,然后使用 TimeZoneInfo.BaseUtcOffset 属性根据偏移差来偏移数据库中的时间
关于 System.TimeZoneInfo 的信息在这里
你知道,这是一个很好的问题。今年我完成了我的第一个数据库应用程序,因为我与时间相关的输入数据是一个 Int64 值,这就是我存储在数据库中的值。我的客户端应用程序检索它并对该值执行 DateTime.FromUTC() 或 FromFileTimeUTC() 并执行 .LocalTime() 以在其本地时间显示内容。我想知道这是否好/坏/可怕,但到目前为止它已经足够满足我的需求了。当然,这项工作最终由我编写的数据访问层库完成,而不是在数据库本身中完成。
似乎工作得很好,但我相信其他对这类事情有更多经验的人可以指出这不是最好的方法。
祝你好运!