Quartz.net - 每 m 个月在第 n 天重复一次?



使用 Quartz.NET,我正在尝试创建一个触发器:

  1. 9月30日开始
  2. 在最后一天重复
  3. 每 5 个月重复一次
  4. 将能够使用ITrigger.GetFireTimeAfter()来计算和预测下一次触发时间以显示在 UI 反馈中。

预期:

  • 2017年9月30
  • 2018年2月28日
  • 2018年7月31日
  • 2018年12月31

我以为我可以使用像0 0 0 L 9/5 ? *这样的CronTrigger.

但是,预计的日子是:

  • 2017年9月30
  • 2018年9月30
  • 2019年9月30日

我也不能使用CalendarIntervalTrigger

例如,如果您选择在 1 月 31 日开始,并且有一个单位为 month 和间隔 1 的触发器,则下一次触发时间将是 2 月 28 日,之后的下一次将是 3 月 28 日 - 基本上每次后续触发都将发生在该月的 28 日,即使存在第 31 天。如果你想要一个总是在当月的最后一天触发的触发器 - 无论当月的天数如何,你应该使用 ICronTrigger

Quartz.NET 文档

如何安排这样的触发器?我是否必须从头开始实现自己的触发器和IScheduler?或者有没有办法让我注入自定义计算?

这不是 cron 表达式的工作方式。通过定义"9/5",你只是表达了"从9月开始"和"5个月开始",但没有第14个月。每个超过月数的月份都会被削减,例如 1/5 将评估为"一月",然后是"六月",最后是"十一月"。另一次尝试将溢出月数,cron 将从头开始。因此,它将从另一个"一月"开始,然后是"六月",最后是"十一月"。看看表达式,如果它像你想要的那样工作,它就不适合明年的表达式,例如 1/5 将在"四月"中计算

1/5 => January (2017) +5
1/5 => June (2017) +5
1/5 => November (2017) +5
1/5 => April (2018) +5

这是错误的!因为四月不适合1/5

这是正确的行为:

1/5 => January (2017) +5
1/5 => June (2017) +5
1/5 => November (2017) +5
1/5 => January (2018) +5
1/5 => June (2018)
... 

您真正需要的是以一种不同方式工作的工具。我认为没有办法强迫 Quartz.NET Cron 按照你想要的方式工作。唯一的方法是用不同的东西"替换"Quartz.NET cron 评估器。如果你环顾四周,你可以找到我是一个作者的库,它实现了小领域特定的语言,应该更适合你想做的事情。我在这里描述了它:评估复杂的时间模式

相关内容

最新更新