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日

我以为我可以使用CronTrigger (即0 0 0 L 9/5 ? *

但预计的日子是:

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

无法使用CalendarIntervalTrigger

例如,如果您选择1月31日发生的开始时间,并且具有单位月和间隔1的触发器,那么下一个开火时间将是2月28日,下一个开始时间将是3月28日 – 并且基本上每个随后的解雇将在本月28日进行,即使存在第31天。 如果您想要一个始终在该月的最后一天触发的触发器 – 无论该月的天数如何,您都应该使用ICronTrigger

Quartz.NET文档

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

谢谢

这不是cron表达式的工作方式。 通过定义它“9/5”你刚刚表达了“从9月开始”和“5个月的icrement”,但没有第14个月。 超过月数的每个月将被削减,例如1/5将评估为“1月”然后“6月”,最后评估为“11月”。 另一个尝试将溢出数月计数和cron将从开始。 所以它将从另一个“1月”开始,然后是“6月”,最后是“11月”。 看看表达式,如果它能够像你想要的那样工作,它将不适合明年的表达式因为例如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评估器。 如果你环顾四周,你可以找到我是作者的库,它实现了小域专用语言,应该更适合你想做的事情。 我在这里描述: 评估复杂的时间模式