如何检测夏令时25小时

时间:2012-11-07 18:29:35

标签: .net datediff

我每天都在给定的时钟时间运行一个进程(在美国 - 这很重要)。我一直试图计算如何在25小时的日子里正确地做到这一点。请考虑以下C#代码:

var referenceDate = new DateTime(2012, 11, 3);
var referenceTime = new TimeSpan(0, 19, 30, 0);
var originalTime = referenceDate.Add(referenceTime);
var tomorrow = referenceDate.AddDays(1);
var nextTimestamp = string.Format(
            "{0} {1:00}:{2:00}", 
            tomorrow.ToShortDateString(), 
            referenceTime.Hours, 
            referenceTime.Minutes);
var nextRunTimestamp = DateTime.Parse(nextTimestamp);

我使用了格式/解析序列来确保在越过DST转换时间时我们可以避免时间跨度。现在应该是以下表达式的结果?

nextRunTimestamp.Subtract(originalTime).TotalHours

嗯,事实证明是24岁,但我认为应该是25岁,因为2012年11月4日是25小时工作日(凌晨2点过渡)所以11月3日19:30和19:30之间的差异11月4日应该是25个小时。

如何获得一年中每个日期的正确答案?

1 个答案:

答案 0 :(得分:3)

实际上听起来你根本不需要那样做。你的问题似乎没什么问题,因为如果你每天在同一时间运行某些东西,它会自动调整你的时间变化。

如果您真的感兴趣,可以通过以下方式获得特定年份的DaylightTime

var dst = TimeZone.CurrentTimeZone.GetDaylightChanges(2012);

对于任何时区,DaylightTime对象都有您的开始日期和时间以及DST的结束日期和时间。从那里,如果您如此倾向,您可以检查DST开始或结束是否在您的时间段内下降,并根据需要增加或减少一小时。

然后在你的代码中你可以拥有诸如(伪代码)之类的逻辑:

if(dst.End > originalTime && dst.End < tomorrow)
    //Add hour for "25 hour" day

if(dst.Start > orginalTime && dst.Start < tomorrow)
    //Subtract hour for "23 hour" day
编辑:我想我误解了你在做什么。虽然上面的代码可以为您提供DST开始或结束时间。您正在寻找:

//Probably DateTime.Now, but whatever
var referenceDate = new DateTime(2012, 11, 3, 19, 30, 0);
var nextTime = referenceDate.AddDays(1);

Timer t = new Timer(nextTime.ToUniversalTime() - referenceDate.ToUniversalTime());

t.Start();

我希望你不是以字符串格式放置你的DateTime然后尝试在你的实际代码中进行Parse ...