2009-08-01 87 views
2

我有去如下要求(相信我,我是太旧了功课笑容计算任务开始时间

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

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

现在这样做的愚蠢做法是采取开始种子,并不断增加频率,直到它变得比“现在”更大。这并不是最佳。要做到这一点的幼稚方法是采取开始种子日期,将其更改为今天的日期并保持原样,然后添加频率直到比现在更大,但假定频率是24小时的倍数。

那么最好/最快的方法是什么? C#解决方案的附加点,但是这足够通用,可以为任何语言制作有趣的谜题:)

回答

6

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

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

+0

这简直就是黑魔法。惊人。 – 2014-08-15 13:37:03

0

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

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

使用吊顶功能保证:NEXT_TIME将> =现在。

你必须做必要的转换,以便能够执行上的日期该算法(例如,转换为UNIX时间,这是秒数自1月1日,1970年)

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

+0

你有一个额外的权利,在频率之后。 – 2009-08-01 07:51:50

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