Quartz CronTrigger - 获得下一个火力时间

cam*_*mbo 21 java cron quartz-scheduler

我正在使用Quartz CronTrigger工具来解析cron调度格式字符串,以确定何时应运行特定作业.我实际上并没有使用Quartz安排工作.

CronTrigger中有一个名为getFireTimeAfter(Date)的方法,它给出下一次作业将在给定日期之后触发的时间.当提供的日期现在或将来时,这很有效.但如果日期已经过去,它似乎不起作用.

Date currTime = new Date();
CronTrigger tr = new CronTrigger();
tr.setCronExpression("0 0 23 3,18 * ? *");
Date nextFireAt = tr.getFireTimeAfter(currTime);
System.out.println("Reference time: " + currTime);
System.out.println("Next fire after reference time: " + nextFireAt);
Run Code Online (Sandbox Code Playgroud)

这是每月3日和18日23:00开火的cron时间表.例如,如果我今天(8月11日)这样做,我看到:

Reference time: Thu Aug 11 10:04:25 MDT 2011
Next fire after reference time: Thu Aug 18 23:00:00 MDT 2011
Run Code Online (Sandbox Code Playgroud)

但是,如果我将参考日期设置为过去,它会给我相同的下一个开火时间.

Reference time: Wed Dec 31 17:00:00 MST 1969
Next fire after reference time: Thu Aug 18 23:00:00 MDT 2011
Run Code Online (Sandbox Code Playgroud)

我期待输出为:

Reference time: Wed Dec 31 17:00:00 MST 1969
Next fire after reference time: Wed Aug 3 23:00:00 MDT 2011
Run Code Online (Sandbox Code Playgroud)

方法是不是打算以这种方式工作,还是我做错了什么?

谢谢!

小智 40

您真正想要直接使用CronExpression对象而不是CronTrigger.正如您所发现的,它不会计算过去的下一次运行时间......但是CronExpression会!

CronExpression的方法有:getNextValidTimeAfter.这就是你想要的.


iba*_*bai 5

在Spring中,您可以遵循他们在集成测试中使用的相同方法。 CronTriggerTests

CronTrigger trigger = new CronTrigger();
trigger.setCronExpression("0 0 23 3,18 * ? *");
SimpleTriggerContext triggerContext = new SimpleTriggerContext();
triggerContext.update(null, null, new Date());
Date nextFireAt = trigger.nextExecutionTime(triggerContext);
Run Code Online (Sandbox Code Playgroud)