cronexpression解析成java日期

use*_*212 8 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*?)
  • 请使用石英或弹簧调度解释示例代码.

Mat*_*att 16

请用:

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());
Run Code Online (Sandbox Code Playgroud)

...然后我建议使用Joda DateTime进行日期比较.

  • 已弃用:需要使用 ```CronExpression Generator = CronExpression.parse(cronExpression)``` (2认同)

kek*_*kec 6

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


Jan*_*vec 5

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

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

public boolean isSatisfiedBy(Date date)
public Date getNextValidTimeAfter(Date date)
Run Code Online (Sandbox Code Playgroud)

至于比较两个cron表达式,您想比较什么?IMO比较有意义的唯一事情是下一个“触发”日期,即从getNextValidTimeAfter([某些参考日期])调用获得的日期。

  • 通常,您无法将cron表达式转换为单个Date实例,因为cron表达式通常表示一系列日期。为了获得Date系列,我认为您可以重复调用getNextValidTimeAfter(Date)方法,并将返回值用作下一次调用的输入值。为了回答您以前的问题,Quartz API不使用Joda-Time,而是使用java.util Date / Calendar API。 (2认同)

f.c*_*sen 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的贡献.在这两种情况下,表达式解析器都是一个很小的类,可以很容易地复制到您自己的项目中.

  • 嘿,这太酷了。我已经使用你的代码来替换依赖于番石榴的 cron-utils,番石榴是我的项目中一个超过 2MB 的怪物 jar:https://github.com/actframework/actframework/blob/master/src/main/java/fc/cron /CronExpression.java (2认同)