【问题标题】:How to determine time interval during DST transition in C#如何在 C# 中确定 DST 转换期间的时间间隔
【发布时间】:2010-11-26 23:13:00
【问题描述】:

我想在 DST 转换期间计算 4 小时后的时间,无论是进入 DST 还是退出 DST。

目前正在这样做:

DateTime now = DateTime.now();
DateTime later = now.AddHours(4);
System.Console.WriteLine(now + " isDST " + now.IsDaylightSavingTime());
System.Console.WriteLine(later + " isDST " + later.IsDaylightSavingTime());

提供:

11/1/2009 12:45:54 AM isDST True
11/1/2009 4:45:54 AM isDST False

我想看到的是:

11/1/2009 12:45:54 AM isDST True
11/1/2009 3:45:54 AM isDST False

我发现这样做的“最佳”方式是像这样通过 UTC 往返:

DateTime now = DateTime.now();
DateTime later = now.ToUniversalTime().AddHours(4).ToLocalTime;
System.Console.WriteLine(now + " isDST " + now.IsDaylightSavingTime());
System.Console.WriteLine(later + " isDST " + later.IsDaylightSavingTime());

似乎我应该能够向 AddHours() 指定返回的时间应该是经过时间或显示时间。我错过了什么?

【问题讨论】:

    标签: c# datetime


    【解决方案1】:

    我不认为你错过了什么。听起来 DateTime 可以有更好的文档或更丰富的界面,但 MSDN recommends using UTC 和你一模一样。

    .NET 和 win32 之间在显示时间方面与现在不同的夏令时规则有一个可爱的时间差异。 .NET 将按照当时的显示方式显示时间,而 win32 将始终根据当前的夏令时标志给出它。

    【讨论】:

      【解决方案2】:

      AddHours() 处理 TimeSpan,它没有“显示时间”甚至时区的真正概念。它本质上是一个完整的刻度。

      如果我正确理解您的意图,我认为您正在做的事情是一种很好的处理方式。

      【讨论】:

        【解决方案3】:

        是的,您应该使用 UTC。

        您实际上是在谈论当前瞬间 4 小时后的 瞬间。不是特定当地时间的 4 小时,而是“经验”时间的 4 小时,如果您愿意的话。 (让我们把相对论排除在外。)想象一个人打电话给另一个人并说,“我会在 4 小时内再给你打电话”——即使他们处于完全不同的时区和不同的 DST 转换,他们也会知道这意味着什么参与。

        为了避免混淆,时刻通常最好用 UTC 表示 - 它们本质上是“通用的”,而不是处于特定时区。

        在您需要之前,我会避免使用当地时间:

        DateTime localTimeInFourHours = DateTime.UtcNow.AddHours(4).ToLocalTime;
        

        或者,如果您想在计算机设置的时区以外的时区结束“本地时间”,您可以使用 DateTimeOffset

        【讨论】:

          猜你喜欢
          • 2016-03-18
          • 1970-01-01
          • 2011-12-20
          • 2012-05-28
          • 2011-07-06
          • 1970-01-01
          • 2019-04-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多