答案 0 :(得分:14)
请使用:
import org.springframework.scheduling.support.CronSequenceGenerator;
final String cronExpression = "0 45 23 * * *";
final CronSequenceGenerator generator = new CronSequenceGenerator(cronExpression);
final Date nextExecutionDate = generator.next(new Date());
...然后我建议使用Joda DateTime进行日期比较。
答案 1 :(得分:5)
我写了一个处理cron表达式的小类,可以在这里找到: https://github.com/frode-carlsen/cron
基于Joda-time,但应该相当容易移植到Java8时间api。这也可以通过调整Joda-time中的DateTime偏移量来嵌入单元测试,模拟等。
它也有很好的测试覆盖率(以TDD Kata的形式完成)。
<强> 更新 强> 现在支持java 8时间api,这要归功于github用户https://github.com/zemiak的贡献。在这两种情况下,表达式解析器都是一个很小的类,可以很容易地复制到您自己的项目中。
答案 2 :(得分:4)
您可能希望查看Quartz API中的org.quartz.CronExpression类。
请注意,您不能简单地将cron表达式与日期进行比较,因为cron表达式(通常)表示各种日期的序列。无论如何,您可能会发现以下方法很有用:
public boolean isSatisfiedBy(Date date)
public Date getNextValidTimeAfter(Date date)
至于比较两个cron表达式,你想要比较什么? IMO唯一有意义的比较是下一个触发器&#39;日期,即从getNextValidTimeAfter([某些参考日期])获得的日期调用。
答案 3 :(得分:3)
也许您可以查看cron-utils 它有一些工具可以在某个日期给出下一个/上一个执行,例如:现在。与JodaTime一起使用,但您可以从那里检索JavaDate。 该库与调度程序无关:您只需提供带有cron表达式的字符串。 与JDK6兼容。