摘要:Java 解析Cron表达式,获取最近运行时间
方法一
packagecom.odj.customer.index.controller;
importjava.text.ParseException;
importjava.text.SimpleDateFormat;
importjava.util.ArrayList;
importjava.util.Calendar;
importjava.util.Date;
importjava.util.HashMap;
importjava.util.List;
importjava.util.Map;
importorg.quartz.CronTrigger;
importorg.quartz.TriggerUtils;
importorg.springframework.scheduling.support.CronSequenceGenerator;
importorg.springframework.stereotype.Controller;
importorg.springframework.util.StringUtils;
importorg.springframework.web.bind.annotation.RequestMapping;
importorg.springframework.web.bind.annotation.RequestMethod;
importorg.springframework.web.bind.annotation.RequestParam;
importorg.springframework.web.bind.annotation.ResponseBody;
importcom.alibaba.fastjson.JSON;
/**
*cron表达式
*@authortanyichengE-mail:65797706@
*@date创建时间:4月13日下午4:23:55
*@version1.0
*/
@RequestMapping("/cron")
@Controller
publicclassCronUtilController{
/**
*根据表达式计算最近运行的时间
*@authortanyicheng创建时间:4月13日-下午4:36:01
*@return
*@throwsParseException
*/
publicStringcronCalculation(Stringcron)throwsParseException{
if(StringUtils.isEmpty(cron)){
thrownewIllegalArgumentException("参数不能为空");
}
CronTriggercronTriggerImpl=newCronTrigger();
cronTriggerImpl.setCronExpression(cron);//这里写要准备猜测的cron表达式
Calendarcalendar=Calendar.getInstance();
Datenow=calendar.getTime();
calendar.add(Calendar.YEAR,2);//把统计的区间段设置为从现在到2年后的今天(主要是为了方法通用考虑,如那些1个月跑一次的任务,如果时间段设置的较短就不足20条)
Listdates=puteFireTimesBetween(cronTriggerImpl,null,now,calendar.getTime());//这个是重点,一行代码搞定~~
System.out.println(dates.size());
SimpleDateFormatdateFormat=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");
Listlist=newArrayList<>();
for(inti=0;i
if(i>19){//这个是提示的日期个数
break;
}
list.add(dateFormat.format(dates.get(i)));
}
returnnull;
}
}
这种方式有一个缺点,如果表达式出发时间间隔较短,响应时间会非常慢
方法二(推荐这种)
publicstaticvoidmain(String[]args)throwsParseException,InterruptedException{
CronSequenceGeneratorcronSequenceGenerator=newCronSequenceGenerator("*****?");
SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");
Listlist=newArrayList<>(20);
DatenextTimePoint=newDate();
for(inti=0;i
//计算下次时间点的开始时间
nextTimePoint=cronSequenceGenerator.next(nextTimePoint);
list.add(sdf.format(nextTimePoint));
}
for(Stringstring:list){
System.out.println(string);
}
}