C# 如何在考虑DST的情况下增加迄今为止的小时数

C# 如何在考虑DST的情况下增加迄今为止的小时数,c#,.net,time,timezone,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); 有一种内置的方法来检查DST,您可以基于该方法执行算术运算,类似于: var test = new DateTimeOffset(new DateTime(2018,

考虑到DST,如何增加迄今为止的小时数?
我们在10月27日换班,所以我预计换班时间为19(或21)小时。
我该怎么做

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

有一种内置的方法来检查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);
        }

你也可以看看

有一种内置的方法来检查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);
        }

你也可以看看

最简单的方法是转换为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

注意,在某些情况下,原始的本地时间可以跳过或模糊不清,但是你应该考虑该怎么做。我个人(出于明显的原因)推荐我的,因为有更多的类型来表示您将使用的不同类型的值。像如何处理跳过/不明确的时间这样的决策更为明显,因为您基本上必须做出这些决策。

最简单的方法是转换为UTC,在那里添加48小时,然后再转换回UTC。这样,您可以在每个点应用适当的时区偏移。例如:

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

注意,在某些情况下,原始的本地时间可以跳过或模糊不清,但是你应该考虑该怎么做。我个人(出于明显的原因)推荐我的,因为有更多的类型来表示您将使用的不同类型的值。诸如如何处理跳过/不明确时间之类的决策更为明显,因为您基本上必须做出这些决策。

将日期时间转换为UTC:

var dateLocal = new DateTime(2018, 10, 26, 20, 0, 0);
var dateUTC = dateLocal.ToUniversalTime();
加上时间:

dateUTC = dateUTC.AddHours(48);
转换回当地时间:

dateLocal = dateUTC.ToLocalTime();

将日期时间转换为UTC:

var dateLocal = new DateTime(2018, 10, 26, 20, 0, 0);
var dateUTC = dateLocal.ToUniversalTime();
加上时间:

dateUTC = dateUTC.AddHours(48);
转换回当地时间:

dateLocal = dateUTC.ToLocalTime();

假设DST始终为1小时,并且始终在该方向。时间工作最好尽量避免假设。@JonSkeet我同意,也更喜欢你的答案。除了一个半未定的例子之外,我省略了任何案例,如果我要添加案例,除了对Nodatime的引用是否真的有意义。时间工作最好尽量避免假设。@JonSkeet我同意,也更喜欢你的答案。除了一个半未定的例子之外,我遗漏了任何一个案例,如果我要添加案例的话,除了对Nodatime的引用之外,其他任何东西是否真的有意义。