我的要求如下(相信我,我的作业太老了 grin )
我有一堆以各种频率运行的任务。他们还有一个开始“种子”日期/时间。起始种子在过去的某个时间,可能是一分钟前,可能是5年前。
我需要计算任务的下一个运行时间,使用开始种子日期/时间和频率 - 它不能简单地“现在”+任务频率(对于那些在MS SQL Server上安排了作业的人)这是一个熟悉的概念)
现在这样做的愚蠢方法是采取起始种子并继续添加频率,直到它变得大于“现在”。那不是最佳选择。这种天真的方式是采取开始种子日期,将其更改为今天的日期并保持原样,然后添加频率,直到它比现在更大,但假设频率是24小时的倍数。 / p>
那么最好/最快的方法是什么? C#解决方案的奖励积分,但这足以为任何语言制作一个有趣的拼图:)
答案 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);