日期时区调整

时间:2008-09-23 00:29:16

标签: c# date

我的数据库位于例如加利福尼亚。 我的用户表包含所有用户的时区,例如-0700 UTC

每当我向居住在用户中的用户显示日期时,如何调整数据库服务器的时间纽约? UTC / GMT -4小时

5 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分: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是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/

我希望这会有所帮助。 :)

答案 2 :(得分:0)

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

如果时差全年总是3小时(夏季和冬季),只需使用 yourDate.AddHours(3) 进行单向更改, yourDate.AddHours(-3) 将其更改回来。请务必将其考虑在一个函数中,说明添加/减去这3个小时的原因。

答案 3 :(得分:0)

您可以使用TimeZoneInfo.GetSystemTimeZones()的组合,然后使用TimeZoneInfo.BaseUtcOffset属性根据偏移差异来偏移数据库中的时间

有关System.TimeZoneInfo here

的信息

答案 4 :(得分:0)

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

似乎工作得很好,但我相信那些对此类事情有更多经验的人可以指出这不是最好的方法。

祝你好运!