如何考虑DST来增加到目前为止的小时数?
我们的时间是10月27日,所以我希望能得到19(或21)小时的结果。
我该怎么办?
var test = new DateTimeOffset(new DateTime(2018, 10, 26, 20, 0, 0));
var test2 = test.AddHours(48);
答案 0 :(得分:6)
最简单的方法是转换为UTC,在那里添加48小时,然后再转换回去。这样,您可以在每个点上应用适当的时区偏移量。例如:
using System;
class Test
{
static void Main()
{
var test = new DateTimeOffset(new DateTime(2018, 10, 26, 20, 0, 0));
var test2 = test.AddHours(48);
var test3 = test.ToUniversalTime().AddHours(48).ToLocalTime();
Console.WriteLine(test2);
Console.WriteLine(test3);
}
}
伦敦时区的结果:
28/10/2018 20:00:00 +01:00
28/10/2018 19:00:00 +00:00
请注意,在某些情况下,原始的本地时间可能会被跳过或模棱两可-您应该考虑该怎么做。我个人(出于明显的原因)为此推荐我的Noda Time project,因为这里有更多类型可以代表您要使用的不同价值类型。诸如如何处理跳过/模糊时间的决策更为明显,因为您基本上必须做出决策。
答案 1 :(得分:2)
将DateTime转换为UTC:
var dateLocal = new DateTime(2018, 10, 26, 20, 0, 0);
var dateUTC = dateLocal.ToUniversalTime();
添加时间:
dateUTC = dateUTC.AddHours(48);
转换回当地时间:
dateLocal = dateUTC.ToLocalTime();
答案 2 :(得分:0)
有一种内置的检查DST的方法,您可以根据类似的方法进行算术:
var test = new DateTimeOffset(new DateTime(2018, 11, 4, 0, 0, 0));
var newTime = test.AddHours(2);
if (test.LocalDateTime.IsDaylightSavingTime() &&
!newTime.LocalDateTime.IsDaylightSavingTime())
{
test = test.AddHours(-1);
}
您可能还会看到nodatime。