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