1

我每天在给定的时钟时间运行一个进程(在美国——这很重要)。我一直在尝试计算如何在一天 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 和 11 月 4 日的 19:30 之间的差异应该是 25 小时。

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

4

1 回答 1

3

实际上,听起来您根本不需要这样做。您的问题似乎没有实际意义,因为如果您每天都在同一时间运行某些东西,它无论如何都会自动适应您的时间变化。

不过,如果您真的感兴趣,您可以通过以下方式获取特定年份的夏令时:

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();

I hope you are not puting your DateTime in a string format then trying to do a Parse in your actual code...

于 2012-11-07T18:58:02.137 回答