我每天都在给定的时钟时间运行一个进程(在美国 - 这很重要)。我一直试图计算如何在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个小时。
如何获得一年中每个日期的正确答案?
答案 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 ...