计算下次运行前的分钟数

时间:2011-03-31 02:43:59

标签: c# algorithm timer

这应该是微不足道的,但今晚我的大脑正在撞墙。

我的流程会运行一次,然后每小时偏移n分钟。

EG,15分钟表示小时(比方说1),然后是1:15,1:30,1:45等。

如果执行间隔为15,则初始执行时间为1:07并持续到1:11,等待下一次执行将在4分钟内完成。

如果执行间隔为15,则初始执行时间为1:07并运行至1:16,等待下一次执行将为14分钟(执行时间不重叠)。

因此,在每次运行(变化的长度)之后,我们如何计算等待下一次执行的分钟数?


我没有在这里放任何示例代码,因为我没有任何可以通过我的单元测试的东西(我不是那么大脑死了,我不能写那些 !)。

我已将此标记为C#,因为我正在编码,但我希望该解决方案与语言无关。

4 个答案:

答案 0 :(得分:3)

好的,正如我在问题上提交时,我有一个顿悟。

鉴于currentMinute> = 0且executionInterval> = 1

absolute-value((currentMinute modulo executionInterval) - executionInterval)

或者,在C#中

return Math.Abs((currentMinute % executionInterval) - executionInterval);

到目前为止,我的单元测试正在传递这个。所以,要么是正确的,要么我没有足够的测试......

答案 1 :(得分:1)

转换为分钟,mod乘15,加1,乘以15,减去原始数字。

// n is time in minutes
int m = n%exec_time;
m += 1;
return m*exec_time - n;

答案 2 :(得分:1)

这可能是您想要的更强大的解决方案,但如果您希望最终用户指定间隔,您可能希望给他的不只是“指定间隔分钟:”选项。看看Cron format。它允许您指定任何类型的奇怪的复杂时间间隔。

好消息是crontab库有很多实现,其中一些是针对C#的。检查NCrontab,它有一些有用的方法,如GetNextOccurences,它将根据间隔输入和当前时间计算日期。如果您使用它,最终可能会节省实现此功能的时间,同时使其更加丰富和有用。

答案 3 :(得分:0)

  • M =下次运行的分钟数
  • To =自首次运行以来已经发生的总分钟数     (在c#中从第一次运行时间减去当前时间并获得TimeSpan.TotalMinutes)
  • I =以分钟为单位的间隔

    M = I - (至%I)