C# 如何在考虑DST的情况下增加迄今为止的小时数
考虑到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,
我们在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的引用之外,其他任何东西是否真的有意义。