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

4 回答 4

22

请用:

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 进行日期比较。

于 2015-12-15T13:22:03.103 回答
10

我写了一个小类来处理 cron 表达式,可以在这里找到: https ://github.com/frode-carlsen/cron

基于 Joda-time,但应该很容易移植到 Java8 time api。这也可以通过调整 Joda-time 中的 DateTime 偏移量来嵌入单元测试、进行模拟等。

它还具有很好的测试覆盖率(作为 TDD Kata 完成)。

得益于 github 用户https://github.com/zemiak的贡献, Update Now 也支持 java 8 time api 。在这两种情况下,表达式解析器都是一个很小的类,可以很容易地复制到您自己的项目中。

于 2014-05-30T08:46:50.177 回答
7

您可能想查看 Quartz API 中的org.quartz.CronExpression类。

请注意,您不能简单地将 cron 表达式与日期进行比较,因为 cron 表达式(通常)表示各种日期的序列。无论如何,您可能会发现以下方法很有用:

public boolean isSatisfiedBy(Date date)
public Date getNextValidTimeAfter(Date date)

至于比较两个 cron 表达式,你想比较什么?IMO 唯一有意义的比较是下一个“触发”日期,即从 getNextValidTimeAfter([some reference date]) 调用中获得的日期。

于 2014-05-26T07:09:46.173 回答
4

也许您可以检查cron-utils 它有一些实用程序可以在给定日期的情况下获得下一次/上一次执行,例如:现在。适用于 JodaTime,但您可以从那里检索 JavaDate。该库与调度程序无关:您只需提供一个带有 cron 表达式的字符串。与JDK6兼容。

于 2015-05-20T16:02:36.687 回答