- 我的数据库有
10 18 16 ? * SUN,MON,WED,FRI *
cron 表达式然后如何转换成 Java 日期。 - 如何与现在的时间进行比较。
- 还有一个是如何与 cron 表达式进行比较,即
10 18 16 ? * SUN,MON,WED,FRI *
和0 30 9 30 * ?
- 请使用石英或弹簧调度解释示例代码。
4 回答
请用:
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 进行日期比较。
我写了一个小类来处理 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 。在这两种情况下,表达式解析器都是一个很小的类,可以很容易地复制到您自己的项目中。
您可能想查看 Quartz API 中的org.quartz.CronExpression类。
请注意,您不能简单地将 cron 表达式与日期进行比较,因为 cron 表达式(通常)表示各种日期的序列。无论如何,您可能会发现以下方法很有用:
public boolean isSatisfiedBy(Date date)
public Date getNextValidTimeAfter(Date date)
至于比较两个 cron 表达式,你想比较什么?IMO 唯一有意义的比较是下一个“触发”日期,即从 getNextValidTimeAfter([some reference date]) 调用中获得的日期。
也许您可以检查cron-utils 它有一些实用程序可以在给定日期的情况下获得下一次/上一次执行,例如:现在。适用于 JodaTime,但您可以从那里检索 JavaDate。该库与调度程序无关:您只需提供一个带有 cron 表达式的字符串。与JDK6兼容。