获取cron表达式下一次的运行时间(反解析cron表达式)&&判断cron表达式下一次的运行时间是否是今天 && 最近的运行时间是否是今天
反解析cron表达式
二话不说,上代码(嗯~,真香)
public static List<Date> getCronRunTime(String cron) {
List<Date> dates = null;
try {
CronTriggerImpl cronTriggerImpl = new CronTriggerImpl();
cronTriggerImpl.setCronExpression(cron);
// 重点(指定获取最近几次的运行时间,这里指定为8次)
dates = TriggerUtils.computeFireTimes(cronTriggerImpl, null, 8);
} catch (ParseException e) {
e.printStackTrace();
}
return dates;
}
判断cron表达式下一次的运行时间是否是今天
public static boolean getLastRunTimeByCron(String cron) {
List<Date> dates = null;
try {
CronTriggerImpl cronTriggerImpl = new CronTriggerImpl();
cronTriggerImpl.setCronExpression(cron);
dates = TriggerUtils.computeFireTimes(cronTriggerImpl, null, 1);
} catch (ParseException e) {
e.printStackTrace();
}
if (dates != null && dates.size() != 0) {
Date date = dates.get(0);
long epochMilli = LocalDateTime.of(LocalDate.now(), LocalTime.MIN).toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
Date firstDate = new Date(epochMilli);
Date lastDate = new Date(epochMilli+86400000);
if (date.before(lastDate) && date.after(firstDate)) {
return true;
}else {
return false;
}
}else {
return false;
}
}
判断cron表达式上一次的运行时间和下一次的运行时间是否是今天(最近的运行时间是否是今天)
public static boolean getLastRunTimeByCron(String cron) {
if(!CronExpression.isValidExpression(cron)){
return false;
}
CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity("Caclulate Date").withSchedule(CronScheduleBuilder.cronSchedule(cron)).build();
Date time0 = trigger.getStartTime();
// 获取下一次运行时间
Date nexTime = trigger.getFireTimeAfter(time0);
// 获取上一次运行时间
Date time2 = trigger.getFireTimeAfter(nexTime);
Date time3 = trigger.getFireTimeAfter(time2);
long last = nexTime.getTime()-(time3.getTime()-time2.getTime());
Date lastDate = new Date(last);
long epochMilli = LocalDateTime.of(LocalDate.now(), LocalTime.MIN).toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
Date firstDatemillisecond = new Date(epochMilli);
Date endDatemillisecond = new Date(epochMilli+86400000);
if (lastDate.after(firstDatemillisecond)&&lastDate.before(endDatemillisecond)) {
return true;
}
if (nexTime.after(firstDatemillisecond)&&nexTime.before(endDatemillisecond)) {
return true;
}
return false;
}