4

我最近在 .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 的跳转是在服务器代码中处理的,但将偏移量传递给 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);
    }
4

1 回答 1

1

您当前的方法没有,但是您可以通过跟踪偏移量做得更好。

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

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

如果您始终如一地使用这些,那么与 UTC 相互转换的需求就消失了。

于 2013-06-09T19:34:15.763 回答