如何在C#中确定DST转换期间的时间间隔

时间:2009-09-09 19:50:06

标签: c# datetime

我想计算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()返回的时间应该是经过的时间或显示时间。我错过了什么?

3 个答案:

答案 0 :(得分:2)

AddHours()处理TimeSpans,它没有“显示时间”甚至时区的真实概念。它基本上是一整套滴答声。

如果我理解你的意图,我认为你所做的是一种非常好的处理方法。

答案 1 :(得分:2)

我认为你没有遗漏任何东西。听起来像DateTime可以有更好的文档或更丰富的界面,但MSDN recommends using UTC与你完全一样。

在显示来自不同夏令时规则的时间与现在相比,.NET和win32之间存在可爱的时差。 .NET将显示当时显示的时间,而win32将始终根据当前的夏令时标记显示时间。

答案 2 :(得分:2)

是的,你应该使用UTC。

您在当前时刻过后4小时内有效地谈论即时。当地时间不是4小时,而是“有经验”时间4小时,如果你愿意的话。 (让我们把相对论留给它。)想象一个人打电话给另一个并说:“我会在4个小时内再次打电话给你” - 两个人都会知道这意味着什么,即使他们在完全不同的时区有不同的DST过渡参与。

通常最好用UTC表示,以避免混淆 - 它们本质上是“普遍的”而不是在特定的时区。

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

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

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