使用场景
想根据cron表达式计算出最近1个月任务执行的具体时间。
一、引入依赖
maven项目引入依赖
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.2</version>
</dependency>
springboot项目引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
二、代码示例
方式1:
import org.quartz.TriggerUtils;
import org.quartz.impl.triggers.CronTriggerImpl;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
public class Test {
public static void main(String[] args) {
try {
CronTriggerImpl cronTriggerImpl = new CronTriggerImpl();
// 每天早上10:15触发
cronTriggerImpl.setCronExpression("0 15 10 * * ?");
Calendar calendar = Calendar.getInstance();
Date now = calendar.getTime();
calendar.add(Calendar.MONTH, 1);//把统计的区间段设置为从现在到1月后的今天(主要是为了方法通用考虑)
// 这里的时间是根据corn表达式算出来的值
List dates = TriggerUtils.computeFireTimesBetween(cronTriggerImpl, null, now, calendar.getTime());
System.out.println(dates.size());
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
dates.forEach(date -> {
Date date1 = new Date(date.toString());
System.out.println(date1.getTime()+" "+dateFormat.format(date));
});
} catch (Exception e) {
e.printStackTrace();
}
}
}
方式二:
import org.quartz.CronExpression;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* 时间辅助类
*/
public class DateUtils {
/**
* 将日期转换为cron时间
*
* @param date
* @return
*/
public static String parseCron(Date date) {
String format="ss mm HH dd MM ? yyyy";
SimpleDateFormat dateFormat = new SimpleDateFormat(format);
return dateFormat.format(date);
}
/**
* 获取下一次的执行时间
*
* @param cron
* @return
* @throws ParseException
*/
public static Date nextTime(String cron, Date date) throws ParseException {
// 加载包之后直接引用这个方法
CronExpression cronExpression = new CronExpression(cron);
// 转换 new Date 是为了给最近一次执行时间一个初始时间,这里给当前时间
Date nextTime = cronExpression.getNextValidTimeAfter(date);
return nextTime;
}
/**
* 获取10个下次执行时间,如果不足10次,则返回实际次数
* @param cron
* @param date
* @return
* @throws ParseException
*/
public static List<Date> next10Times(String cron, Date date) throws ParseException {
return nextTimes(cron,date,10);
}
/**
* 获取n个下次执行时间,如果不足n次,则返回实际次数
* @param cron
* @param date
* @param n
* @return
* @throws ParseException
*/
public static List<Date> nextTimes(String cron, Date date,int n) throws ParseException {
List<Date> nextTimes = new ArrayList<>();
Date nextTime = date;
for (int i = 0; i < n; i++) {
Date date1 = nextTime(cron, nextTime);
if (null == date1) {
break;
}
nextTimes.add(date1);
nextTime = date1;
}
return nextTimes;
}
/**
* 时间转字符串
* @param date
* @return
*/
public static String parseDate(Date date){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String dateFormat = sdf.format(date);
return dateFormat;
}
/**
* 字符串转时间
* @param dateString
* @return
* @throws ParseException
*/
public static Date toDate(String dateString) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date dateFormatParse = sdf.parse(dateString);
return dateFormatParse;
}
}
三、测试运行
@Test
public void testNextTime() throws ParseException {
String cron="0 0 1 * * ?";
System.out.println("cron表达式:"+cron);
System.out.println("--------获取下1次的执行时间-----------");
//获取下一次的执行时间
//下一次执行时间
System.out.println(DateUtils.parseDate(DateUtils.nextTime(cron,new Date())));
System.out.println("--------获取未来10次的执行时间-----------");
//获取下10次执行时间
List<Date> list= DateUtils.next10Times(cron,new Date());
for(Date d:list){
System.out.println(DateUtils.parseDate(d));
}
System.out.println("--------获取未来10次的执行时间-----------");
String cronStr=DateUtils.parseCron(new Date(System.currentTimeMillis()+3600_000));
System.out.println("1小时之后执行的cron表达式:"+cronStr);
//获取下10次执行时间
List<Date> list2= DateUtils.next10Times(cronStr,new Date());
for(Date d:list2){
System.out.println(DateUtils.parseDate(d));
}
}
传送门
也可以使用网上提供的cron工具,在线解释cron表达式
https://tool.lu/crontab/