2012-10-18 24 views
4

最近,我在.NET中的时区感知Web应用程序中一直在讨论时区。我提出了以下处理时区的解决方案。在.net中处理与时区有关的日期时间的最佳方法

我的解决办法是:

  • 有用户配置文件存储他们在
  • 在Web服务器上的时区做所有的转换和从UTC。
  • 将日期作为UTC存储在数据库中。

我的问题是:

  1. 你们是否认为这是在.net中的最佳方法?
  2. 正在使用UTC的datetime2足够好,或者我应该将 偏移量中的客户端时间存储在数据库中(基本上10-10-2012 4:00:00与10-10-2012 00:00:00 4: 00)?另外,你们中的一些人可能会注意到,虽然跨DST的跳转是在服务器代码中处理的,但将偏移量传递到SP或类似的DB上将无法正确处理DST。对此有何想法?

下面是时间转换的示例代码。

private TimeZoneInfo GetTimeZoneInfo() 
    { 
     var timeZone = TimeZoneDropdown.SelectedValue; 

     switch (timeZone) 
     { 
      case "Eastern": 
       return TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); 
      case "Central": 
       return TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time"); 
      case "Mountain": 
       return TimeZoneInfo.FindSystemTimeZoneById("Mountain Standard Time"); 
      case "Pacific": 
       return TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"); 
      case "Alaskan": 
       return TimeZoneInfo.FindSystemTimeZoneById("Alaskan Standard Time"); 
     } 

     return TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); 
    } 

    public DateTime ConvertLocalDateTimeToUtc(DateTime dateTime) 
    { 
     var timeZone = GetTimeZoneInfo(); 

     return TimeZoneInfo.ConvertTimeToUtc(DateTime.SpecifyKind(dateTime, DateTimeKind.Unspecified), timeZone); 
    } 

    public DateTime ConvertUtcToLocalDateTime(DateTime dateTime) 
    { 
     var timeZone = GetTimeZoneInfo(); 

     return TimeZoneInfo.ConvertTimeFromUtc(DateTime.SpecifyKind(dateTime, DateTimeKind.Utc), timeZone); 
    } 
+0

有一个缺点是在数据库中将日期时间存储为UTC。你如何考虑数据库方面的DST?根据时区和DST,无法将DateTime或DateTime2转换为用户本地时间。如果你通过一个偏移量,那么你可能仍然会因为有一天在DST中而另一个不在。示例3/10/2012 2:00:00美国东部标准时间是2012年3月9日20:00:00,但2012年3月13日2:00:00美国东部标准时间是2012年3月12日19:00:00。基本上分别是-4和-5的偏移量。那么你传递给你的SP -4或-5将UTC转换为本地的偏移量?无论哪种方式是错的。 – aBetterGamer

+0

我认为你需要提供更多关于时间如何使用的信息。如果是时间戳,那么数据库的本地时间戳格式(几乎肯定)就是答案(可能是UTC)。如果只是向用户显示他们上次登录的时间,那么本地时间字符串可能是合适的。 – MZB

回答

1

您当前的做法是不,但你可以通过跟踪偏移做得更好。

当你谈论偏移时,你似乎认为它们与时区有关。但是要意识到大多数时区有两个不同的偏移量,一个用于标准时间,另一个用于白天时间。两者的Microsoft时区ID在字符串中仍具有“标准”,因此这可能是混淆的一部分。但是您正在使用的TimeZoneInfo确实跟踪标准和日光偏移量。

您需要将偏移量与每个单独的日期和时间相关联。你可以使用.Net中的DateTimeOffset类和SQL Server中的datetimeoffset数据类型。

如果您持续使用这些参数,则需要翻译UTC和UTC。

相关问题