使用Quartz.NET,我正在尝试创建一个触发器:
ITrigger.GetFireTimeAfter()
来计算/投射下一次开火时间(UI反馈)预期:
我以为我可以使用CronTrigger
(即0 0 0 L 9/5 ? *
)
但预计的日子是:
无法使用CalendarIntervalTrigger
:
例如,如果您选择1月31日发生的开始时间,并且具有单位月和间隔1的触发器,那么下一个开火时间将是2月28日,下一次开始时间将是3月28日 - 基本上每个后续的射击将在本月28日发生,即使存在第31天。如果您想要一个始终在该月的最后一天触发的触发器 - 无论该月的天数如何,您都应该使用ICronTrigger
如何安排这样的触发器?我是否必须从头开始实现自己的触发器和IScheduler?或者我有办法注入自定义计算吗?
由于
答案 0 :(得分:1)
这不是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评估器。如果你环顾四周,你可以找到我作为作者的库,它实现了小域专用语言,应该更适合你想做的事情。我在这里描述了它:Evaluate complex time patterns