要获取 Java 中 Cron 表达式的上一个有效执行日期,可以使用不同的方式实现。以下是两种常见的实现方式,一种是使用第三方库 Quartz Scheduler,另一种是使用 Java 内置的 ScheduledExecutorService 和自定义逻辑。
步骤流程:
添加 Quartz Scheduler 依赖。
Maven 依赖坐标:
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.2</version>
</dependency>
Gradle 依赖坐标:
implementation 'org.quartz-scheduler:quartz:2.3.2'
创建一个 Java 类来配置 Quartz Scheduler,并定义任务(Job)和触发器(Trigger)。
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
public class CronScheduler {
public static void main(String[] args) throws SchedulerException {
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
JobDetail jobDetail = JobBuilder.newJob(MyJob.class)
.withIdentity("myJob")
.build();
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("myTrigger")
.withSchedule(CronScheduleBuilder.cronSchedule("0 0 12 * * ?")) // 设置Cron表达式
.build();
scheduler.scheduleJob(jobDetail, trigger);
scheduler.start();
// 获取上一个有效执行日期
TriggerKey triggerKey = TriggerKey.triggerKey("myTrigger");
Trigger triggerFromScheduler = scheduler.getTrigger(triggerKey);
Date previousFireTime = triggerFromScheduler.getPreviousFireTime();
System.out.println("上一个有效执行日期: " + previousFireTime);
}
public static class MyJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
// 执行任务的逻辑
}
}
}
这个示例中,我们首先创建了一个 Quartz Scheduler 实例,然后配置了一个 Job 和一个 Trigger,其中 Trigger 使用了 Cron 表达式来定义执行计划。最后,我们通过获取 Trigger 的上一个有效执行日期来得到所需的结果。
步骤流程:
创建一个 Java 类,使用 ScheduledExecutorService 来执行定时任务,并编写自定义逻辑以计算上一个有效执行日期。
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class CronExecutor {
public static void main(String[] args) {
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
// 定义Cron表达式
String cronExpression = "0 0 12 * * ?";
// 获取上一个有效执行日期
long initialDelay = calculateInitialDelay(cronExpression);
executorService.scheduleAtFixedRate(() -> {
Date previousValidExecutionDate = calculatePreviousValidExecutionDate(cronExpression);
System.out.println("上一个有效执行日期: " + previousValidExecutionDate);
}, initialDelay, 24, TimeUnit.HOURS); // 每天检查一次
// 等待程序运行
executorService.shutdown();
}
private static long calculateInitialDelay(String cronExpression) {
// 计算初始延迟,使其在下一个Cron触发之前
try {
SimpleDateFormat dateFormat = new SimpleDateFormat("ss mm HH dd MM ? yyyy");
Date now = new Date();
Date nextValidExecutionDate = new CronExpression(cronExpression).getNextValidTimeAfter(now);
return nextValidExecutionDate.getTime() - now.getTime();
} catch (ParseException e) {
throw new IllegalArgumentException("无效的Cron表达式", e);
}
}
private static Date calculatePreviousValidExecutionDate(String cronExpression) {
// 计算上一个有效执行日期
try {
SimpleDateFormat dateFormat = new SimpleDateFormat("ss mm HH dd MM ? yyyy");
Date now = new Date();
Date previousValidExecutionDate = new CronExpression(cronExpression).getPreviousValidTimeBefore(now);
return previousValidExecutionDate;
} catch (ParseException e) {
throw new IllegalArgumentException("无效的Cron表达式", e);
}
}
}
在这个示例中,我们使用 ScheduledExecutorService 来定期执行一个任务,该任务计算上一个有效执行日期。首先,我们计算初始延迟,以确保在下一个 Cron 触发之前执行第一次任务。然后,我们计算上一个有效执行日期。
无论使用哪种方式,都可以获得 Cron 表达式的上一个有效执行日期。选择哪种方式取决于您的项目需求和偏好以及是否想要使用 Quartz Scheduler 这样的第三方库。