计算任务开始时间

时间:2009-08-01 07:31:05

标签: algorithm scheduling

我的要求如下(相信我,我的作业太老了 grin

我有一堆以各种频率运行的任务。他们还有一个开始“种子”日期/时间。起始种子在过去的某个时间,可能是一分钟前,可能是5年前。

我需要计算任务的下一个运行时间,使用开始种子日期/时间和频率 - 它不能简单地“现在”+任务频率(对于那些在MS SQL Server上安排了作业的人)这是一个熟悉的概念)

现在这样做的愚蠢方法是采取起始种子并继续添加频率,直到它变得大于“现在”。那不是最佳选择。这种天真的方式是采取开始种子日期,将其更改为今天的日期并保持原样,然后添加频率,直到它比现在更大,但假设频率是24小时的倍数。 / p>

那么最好/最快的方法是什么? C#解决方案的奖励积分,但这足以为任何语言制作一个有趣的拼图:)

3 个答案:

答案 0 :(得分:6)

更好的方法是获取开始时间戳和当前时间戳之间的差值,将其除以频率,将得到的乘数四舍五入到最接近的整数,再次乘以频率,并将其添加到开始时间戳再一次。

四舍五入的行为将提供适当的抵消。

答案 1 :(得分:0)

你的回答基本上是这样的:

next_time = ceiling((now - seed)/frequency) * frequency + seed

使用天花板功能可确保next_time为> = now。

您必须进行必要的转换才能在日期上执行此算术(例如,转换为UNIX时间,即自1970年1月1日以来的秒数。)

我不熟悉C#所以我不能提供代码,但我认为C#有日期/时间实用程序类来处理日期/时间算术运算。

答案 2 :(得分:0)

有趣的谜题,感谢您的挑战:)

这应该在c#中完成。几乎可以肯定会减少,但其冗长足以解释最新情况。

// Initialise with date the event started, and frequency
DateTime startDate = new DateTime(2009, 8,1,9,0,0);
TimeSpan frequency = new TimeSpan(0, 15, 0);

// Store datetime now (so that it doesnt alter during following calculations)
DateTime now = DateTime.Now;

// Calculate the number of ticks that have occured since the event started
TimeSpan pastTimeSpan = now.Subtract(startDate);

// Divide the period that the event has been running by the frequency
// Take the remaining time span
TimeSpan remainingTimeSpan = new TimeSpan(pastTimeSpan.Ticks % frequency.Ticks);

// Calculate last occurence the event ran
DateTime lastOccurence = now.Subtract(remainingTimeSpan);

// Calculate next occurence the event will run
DateTime nextOccurence = lastOccurence.Add(frequency);