【问题标题】:Quartz.net - Repeat on day n, of every m months?Quartz.net - 在第 n 天重复,每 m 个月?
【发布时间】:2017-07-10 07:18:38
【问题描述】:

使用 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 日的开始时间,并且有一个单位为 Month 和间隔 1 的触发器,那么下一次触发时间将是 2 月 28 日,之后的下一次触发时间将是 3 月 28 日 -并且基本上每个后续的触发都将在每月的 28 日发生,即使存在第 31 天。如果您想要一个始终在该月的最后一天触发的触发器 - 无论该月有多少天,您都应该使用 ICronTrigger

Quartz.NET documentation

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

谢谢

【问题讨论】:

  • 这不是我每次都尝试过的东西,但可以使用 Cron Expression 0 0 0 L */5 吗? * 与 ModifiedByCalendar 和几个 CronCalender 一起排除 2017 年的 7、8、10、11、12 个月和 2018 年的 1、3、4、5、6、8、9、10、11 等月份。

标签: c# cron quartz.net


【解决方案1】:

这不是 cron 表达式的工作方式。通过将其定义为“9/5”,您只是表示“从 9 月开始”和“5 个月前的小数”,但没有第 14 个月。每个超过月数的月都会被削减,例如 1/5 将评估为“一月”,然后是“六月”,最后是“十一月”。另一个尝试将溢出月数,并且 cron 将从头开始。所以它将从另一个“一月”开始,然后是“六月”,最后是“十一月”。看看这个表达式,如果它可以像你想要的那样工作,它不适合明年的表达式,因为例如 1/5 将在“April”中计算

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 evaluator。如果您环顾四周,您会发现我是作者的库,它实现了小型领域特定语言,应该更适合您想做的事情。我在这里描述过:Evaluate complex time patterns

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 2011-11-08
    • 2014-03-18
    • 2015-11-28
    • 2018-07-31
    相关资源
    最近更新 更多