cronexpression解析成java日期

时间:2014-05-23 17:27:26

标签: cron quartz-scheduler cronexpression spring-scheduled

  • 我的数据库有(10 18 16?* SUN,MON,WED,FRI *) cron表达式,然后如何转换为java日期。
  • 如何与现在的时间进行比较。
  • 还有一个是如何与cron表达式进行比较,即(10 18 16?* SUN,MON,WED,FRI *)(0 30 9 30 *?)
  • 请使用石英或弹簧调度解释示例代码。

4 个答案:

答案 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兼容。