前言
项目中使用cron表达式来作为定时调度的参数,又需要根据执行的周期来计算一些平均数据,所以需要根据cron表达式获取执行周期。
spring 5.3 以上提供了 CronExpression,可以用来实现该需求。
一、代码示例
1、计算固定的周期
通过下次执行时间和下下次执行时间之差计算
public class CronTest {
/**
* 根据cron表达式获取执行周期
*/
@Test
public void getPeriodByCron() {
//30s执行一次
String cron = "0/30 * * * * ?";
//spring @since 5.3
CronExpression cronExpression = CronExpression.parse(cron);
//下次预计的执行时间
LocalDateTime nextFirst = cronExpression.next(LocalDateTime.now());
//下下次预计的执行时间
LocalDateTime nextSecond = cronExpression.next(nextFirst);
//计算周期1
long between1 = ChronoUnit.SECONDS.between(nextFirst, nextSecond);
Assert.assertEquals(between1, 30);
//计算周期2
long between2 = Duration.between(nextFirst, nextSecond).getSeconds();
Assert.assertEquals(between2, 30);
}
}
2、计算多个周期
不固定的周期,获取最近几次的预定执行时间
@Test
public void getEveryPeriodByCron() {
List<Long> periods = new ArrayList<>();
//每小时的前5分钟每分钟执行一次,这种周期不是固定的
String cron = "0 0,1,2,3,4,5 * * * ? ";
//spring @since 5.3
CronExpression cronExpression = CronExpression.parse(cron);
//下次预计的执行时间
LocalDateTime preTime = cronExpression.next(LocalDateTime.now());
int i = 0;
while (i++ < 10) {
LocalDateTime nextTime = cronExpression.next(preTime);
long between = ChronoUnit.SECONDS.between(preTime, nextTime);
preTime = nextTime;
periods.add(between);
}
System.out.println(ArrayUtils.toString(periods));
}