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

4

我希望能够计算在夏令时转换期间四小时后的时间,无论是进入夏令时还是退出夏令时。

目前正在进行以下操作:

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个回答

2

是的,您应该使用UTC。

实际上,您在当前时间之后4小时讨论的是一个瞬间。不是特定本地时间的4小时,而是“经验”时间的4小时,如果您愿意的话。(让我们把相对论放在一边。)想象一个人打电话给另一个人并说:“我会在4小时后再打给你”,即使他们处于完全不同的时区,并涉及不同的夏令时转换,两者都将知道这意味着什么。

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

在需要之前,最好避免使用本地时间:

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

如果你想要在与计算机设置不同的时区中得到“本地时间”,你可以使用 DateTimeOffset


2

AddHours() 处理的是时间跨度,它们没有真正的“显示小时”或时区的概念。它本质上是一个整数滴答数。

如果我正确理解您的意图,我认为您所做的方式是相当不错的。


2
我认为你没有错过任何东西。听起来DateTime可能有一个更好的文档或更丰富的接口,但是MSDN建议像你现在这样使用UTC
在显示来自不同夏令时规则的时间差异方面,.NET和win32之间存在一种有趣的时间差异。 .NET将显示它在那个时间应该显示的时间,而win32将始终以当前夏令时标志的方式给出时间。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接