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



我最近在.NET中的时区意识到Web应用程序中与时区弄乱。我提出了以下解决方案的解决方案。

我的解决方案是:

  • 让用户配置文件存储他们所在的时区。
  • 在Web服务器上进行往返UTC的所有转换。
  • 将日期存储在DB中,作为UTC。

我的问题是:

  1. 你们认为这是.NET中最好的方法吗?
  2. 在UTC中使用DateTime2足够好,或者我应该将客户储存时间 偏移DB(基本上是10-10-2012 4:00:00 vs 10-10-2012 00:00:00 4:00)?
  3. 顺便说一句,你们中的一些人可能会注意到,跨DST在服务器代码中处理时,将偏移量传递到DB上的SP或类似程序将无法正确处理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);
    }

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

当您谈论偏移时,似乎您正在考虑它们与时区相关联。但是要意识到,大多数时区都有两个不同的偏移,一个是标准时间,一个是在白天的时间。两者的Microsoft时区ID仍然在字符串中具有"标准",因此这可能是混乱的一部分。但是您正在使用的TimeZoneInfo确实在跟踪标准和日光偏移。

您需要将偏移与每个单独的日期和时间相关联。您可以使用.NET中的DateTimeOffset类和SQL Server中的datetimeoffset数据类型来做到这一点。

如果您始终使用这些使用,则需要转换往返UTC的需要。

相关内容

  • 没有找到相关文章

最新更新