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