.net - 在 .Net 中处理与时区相关的日期时间的最佳方法

标签 .net sql-server timezone timezone-offset

我最近一直在 .net 中的时区感知 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);
    }

最佳答案

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

当您谈论偏移时,您似乎认为它们与时区相关。但请注意,大多数时区都有两种不同的偏移量,一种是标准时间,另一种是夏令时。两者的 Microsoft 时区 ID 字符串中仍然包含“Standard”,因此这可能是造成困惑的一部分。但您正在使用的 TimeZoneInfo 确实在跟踪标准偏移量和日光偏移量。

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

如果您始终如一地使用这些,则无需在 UTC 之间进行转换。

关于.net - 在 .Net 中处理与时区相关的日期时间的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12956904/

相关文章:

Java Quartz 默认时区

java - Joda 日期时间 DateTimeZone

.net - COM LocalServer 的 .NET 等价物是什么?

c# - 数据变化发生在单位换算中

.net - 如何强制在 Visual Studio 2013 中打开解决方案文件 (SLN)?

sql-server - 无法在 SQL Management Studio 2008 中更改服务器类型

c++ - 打印处理程序时经过的总时间

c# - 具有 OR 约束的通用类型属性

c# - 有人试图侵入我的网站

sql-server - Sql Service Broker 和事务