【问题标题】:Calculate Cron Next Run Time in C#在 C# 中计算 Cron 下次运行时间
【发布时间】:2011-12-28 14:43:35
【问题描述】:

我有类似 crontab 的调度程序。时间定义“MM HH WD MD M”:

MM- 分钟
HH- 小时
WD- 一周中的天数
MD - 月中的天数
M - 月数

WD、MD、M 允许多个条目,每个参数都可以为空,例如:

^ ^  0, 1  ^ ^      means exucution every minute, every hour, at sunday and mondey, every day<br>

35 15 ^ ^ ^    execution every day at 15.35<br>

如果您知道上次执行日期,问题是如何计算下一次运行时间。我知道如何使用循环来做到这一点(只需添加 1 分钟,直到它符合条件),但必须有更好的方法。

【问题讨论】:

  • 我希望你没有低估这份工作。如果您真的想与(POSIX)cron 兼容,您将have to cater for a lot more than that(我知道,我已经在 C++ 中实现过一次)
  • @kol:我猜他需要 Noda Time edit 很多时间.... :)
  • 如果先是MM HH,那么15 35不会抛出异常吗?
  • if you know last execution date - 呃……最后一次执行与 crontab 规范无关(它们是绝对时间参考)

标签: c# algorithm crontab


【解决方案1】:

我已经成功地将NCrontab 用于此目的。

使用类似的东西

var schedule = CrontabSchedule.Parse("15 35 * * *");
return schedule.GetNextOccurrence(DateTime.Now);

【讨论】:

  • 酷!但是一个问题。例如,如果 SomeDate 是执行时间 GetNextOccurence(SomeDate) 将返回 SomeDate?
  • 很确定它会返回下一次出现,但 GetNextOccurrences(startTime, endTime) 将返回该范围内所有出现的 IEnumerable。 :)
【解决方案2】:

Cronos 是解决此问题的另一个绝佳选择。

【讨论】:

    【解决方案3】:

    您可以使用DateTimeTimeSpan 自己编写代码 - 例如:

    DateTime.Now == DateTime.Now.Date.AddHours (15).AddMinutes (35)
    

    检查当前是否为 15:35(因此需要执行一些操作),可以针对星期几、月份等执行类似的检查。

    或使用一个非常好的开源 .NET 库,称为 NodaTime(绝对是更好的方法)。

    另一种选择是使用不同的架构 - 对于此类调度程序类型的应用程序/服务,有一个名为 Quartz 的开源 .NET 库(甚至更好),它在这些计算中执行了许多其他非常有用的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多