如何考虑DST来增加到目前为止的小时数

时间:2018-11-01 14:37:16

标签: c# .net time timezone

如何考虑DST来增加到目前为止的小时数?
我们的时间是10月27日,所以我希望能得到19(或21)小时的结果。
我该怎么办?

  var test = new DateTimeOffset(new DateTime(2018, 10, 26, 20, 0, 0));
  var test2 = test.AddHours(48);

3 个答案:

答案 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