处理.Net中时区的日期时间的最佳方法

时间:2012-10-18 14:24:35

标签: .net sql-server timezone timezone-offset

我最近在.net中的时区感知Web应用程序中乱搞了时区。我已经提出了以下处理时区的解决方案。

我的解决方案是:

  • 让用户个人资料存储他们所在的时区。
  • 在Web服务器上执行与UTC之间的所有转换。
  • 将日期作为UTC存储在数据库中。

我的问题是:

  1. 你们认为这是.net中最好的方法吗?
  2. 使用UTC中的datetime2足够好,还是应该将客户端存储时间     数据库中的偏移量(基本上是10-10-2012 4:00:00 vs 10-10-2012     00:00:00 4:00)?
  3. 顺便说一下,你们中的一些人可能会注意到,虽然在服务器代码中处理了跨越DST的跳转,但是在数据库中将偏移量传递给SP等将无法正确处理DST。有什么想法吗?
  4. 以下是时间转换的示例代码。

        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);
        }
    

1 个答案:

答案 0 :(得分:1)

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

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

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

如果你一直使用这些,那么转换到UTC的需求就会消失。