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

C# 如何在C语言中确定DST转换期间的时间间隔#,c#,datetime,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.IsDaylightSav

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

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


如果我正确理解你的意图,我认为你所做的是一种很好的处理方式。

我不认为你遗漏了什么。听起来DateTime可以有一个更好的文档化或更丰富的界面,但和您完全一样


NET和win32之间有一个可爱的时差,显示的时间不同于现在的夏令时规则。NET将按当时的显示方式显示时间,而win32将始终按照当前的夏令时标志显示时间。

是的,您应该使用UTC

你实际上是在谈论当前瞬间4小时后的某个瞬间。不是特定当地时间的4小时,而是“经验”时间的4小时,如果你愿意的话。(让我们撇开相对论不谈)想象一个人打电话给另一个人说,“4小时后我再打电话给你”——两人都知道这意味着什么,即使他们在完全不同的时区,涉及不同的DST转换

为了避免混淆,瞬间通常最好用UTC表示——它们本质上是“通用的”,而不是在特定的时区

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

DateTime localTimeInFourHours = DateTime.UtcNow.AddHours(4).ToLocalTime;
或者,如果希望在计算机设置的时区以外的时区中使用“本地时间”,则可以使用
DateTimeOffset