cron表达式解析为java数据 我的数据库有101816?*SUN、MON、WED、FRI*cron表达式,然后如何转换为Java日期 如何与现在的时间进行比较 还有一个问题是如何与cron表达式进行比较,即101816?*周日、周一、周三、周五*和0 30 9 30*? 请解释使用quartz或spring调度的示例代码

cron表达式解析为java数据 我的数据库有101816?*SUN、MON、WED、FRI*cron表达式,然后如何转换为Java日期 如何与现在的时间进行比较 还有一个问题是如何与cron表达式进行比较,即101816?*周日、周一、周三、周五*和0 30 9 30*? 请解释使用quartz或spring调度的示例代码,cron,quartz-scheduler,spring-scheduled,Cron,Quartz Scheduler,Spring Scheduled,您可能需要查看Quartz API中的类 请注意,不能简单地将cron表达式与日期进行比较,因为cron表达式(通常)表示各种日期的序列。在任何情况下,您都会发现以下方法很有用: public boolean isSatisfiedBy(Date date) public Date getNextValidTimeAfter(Date date) 至于比较两个cron表达式,您想比较什么?IMO唯一有意义比较的是下一个“触发器”日期,即从getNextValidTimeAfter([一些参考日

您可能需要查看Quartz API中的类

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

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

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

我编写了一个用于处理cron表达式的小类,可在此处获得:

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

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

更新 由于github用户的贡献,现在还支持Java8时间api。在这两种情况下,表达式解析器都是一个很小的类,可以很容易地复制到您自己的项目中

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

请使用:

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

它在maven central上吗?不,它只是一个单独的类,只取决于Joda时间,所以我不介意。你可以随意用叉子或模仿者嘿,这很酷。我已经用您的代码替换了依赖于guava的cron utils,guava是我项目中一个超过2MB的怪物罐子:cron utils似乎不再需要guava依赖。5.0.0版依赖于JDK8,不再需要番石榴和jodatime。这正是我想要的。一个执行类似cron的解析的小类。非常感谢你!这是基于乔达的时间吗?还是怎样我们希望将cron转换为java日期。实现的方法是什么?通常无法将cron表达式转换为单个日期实例,因为cron表达式通常表示一系列日期。要获取日期序列的值,我认为可以重复调用getNextValidTimeAfter(Date)方法,并使用返回的值作为下一次调用的输入值。为了回答前面的问题,Quartz API不使用Joda时间,它使用java.util日期/日历API。cron-utils很好。唯一的问题是它有番石榴依赖性,超过2百万番石榴依赖性是一个问题。从5.0.0版开始,他们通过迁移到JDK8将其删除。现在这个库的依赖性更少了,因为它们还利用新的Java支持摆脱了jodatime。但现在它锁定到了Java8。最后我使用了这个单文件解析器:当然,是一个选项:)最终您需要绑定到一些JDK。谢谢您的建议。我需要joda在核心UTIL方面的时间支持。因此我选择了4.1.3版本。工作如期,太棒了!非常感谢你!cron的Spring实现缺少一项功能——“day”和“day of week”字段由and逻辑组合而成,而不是由cron中的and或as组合而成。@Eugene我不认为这是一个缺点。。。通过提供2个表达式,可以轻松模拟“或”-ed表达式。使用和,您有可以执行的优势,例如“每两个星期四在…”