cron表达式实例:
- 每1小时30分钟执行一次(间隔时间90分钟)
使用两条cron表达式实现每90分钟执行一次。
第一条以01:30为起点,执行周期为3小时。
第二条以00:00为起点,执行周期为3小时。(cron表达式间隔周期只能填整数)
90 * 2=180=60 * 3(180分钟是60分钟的3倍,因为间隔周期只能为小时的整数,所以间隔周期一定为60的倍数)【也可以这样想,间隔时间和60的最小公倍数,这里就是90和60的最小公倍数是180】
//每1个半小时执行(00:00,01:30,03:00,04:30...)
"0 30 1/3 * * ?" //01:30,04:30,07:30..
"0 0 0/3 * * ?" //00:00,03:00,06:00..
- 每1小时20分钟执行一次(间隔时间80分钟)
使用三条cron表达式实现每80分钟执行一次。
第一条以01:20为起点,执行周期为4小时。
第二条以02:40为起点,执行周期为4小时。
第三条以04:00位起点,执行周期为4小时。
80 * 3=240=60 * 4
//每80分钟执行(01:20,02:40,04:00,05:20...)
"0 20 1/4 * * ?" //01:20,05:20,09:20..
"0 40 2/4 * * ?" //02:40,06:40,10:40..
"0 0 4/4 * * ?" //04:00,08:00,12:00..
- 每1小时40分钟执行一次(间隔时间为100分钟)
使用三条cron表达式实现每100分钟执行一次。
第一条以01:40为起点,执行周期为5小时。
第二条以03:20为起点,执行周期为5小时。
第三条以05:00位起点,执行周期为5小时。
100 * 3=300=60 * 5
//每100分钟执行(01:40,03:20,05:00,06:40...)
"0 40 1/5 * * ?" //01:40,06:40,11:40..
"0 20 3/5 * * ?" //03:20,08:20,13:20..
"0 0 5/5 * * ?" //05:00,10:00,15:00..
(这里的cron表达式函数只会生成超过1小时且不超过1天间隔时间范围的,1小时内的需要另外判断,比如说:我需要25分钟执行一次【cron表达式:(0 0/25 * * * ? )】,那执行时间就为00:25,00:50,01:00,01:25,01:50… ,也就是说超出1小时的部分,就会从0再开始执行周期而不是00:50的基础上增加25分钟,不会变成01:15那样。所以这里的cron表达式只支持小时部分的自定义生成,不支持秒,分钟,天,年…)
java语言写的cron表达式生成函数(自定义小时部分):
- 【生成函数的原理在于:1.找到所有的起始时间,2.对应的执行周期,然后就可以拼接出cron表达式了。】不用规定结束时间的原因是,超出1天的部分,又会从0点0分开始重新按周期执行,所以我们只需要(起始时间+间隔周期)就能得到所需cron表达式
//periodTime 间隔时间 单位:分钟
//返回列表形式的String类型数据,将每一条cron表达式作为列表中的一项
public List<String> createCron(Integer periodTime){
List<String> cronList=new ArrayList<>();
String cronStr = "* * * * * ?";
int extraMin;
//间隔时间大于1小时且不超过1天的情况
if (periodTime>=60&&periodTime<=(60*24)){
//间隔多少小时hour,以及额外多少分钟minutes
int hours=periodTime/60;
int minutes=periodTime%60;
if(hours>24||minutes>60){
System.out.println("间隔时间超过1天");
cronList.add(cronStr);
return cronList;
}
if(minutes==0){
//cron="0 0 0/2 * * ?" 从0小时开始,每2小时执行一次
cronStr="0 0 0/"+(periodTime/60)+" * * ?";
cronList.add(cronStr);
return cronList;
}
else{
//开始
int n=2;
//当间隔时间大于半天,一天无法执行2次
if((periodTime*n)>(24*60)){
int phours=periodTime/60;
int pMins=periodTime%60;
//cron="0 30 12 * * ?" 每天的12点半执行
cronStr="0 "+pMins+" "+phours+" * * ?";
cronList.add(cronStr);
return cronList;
}
//找到倍数
while((periodTime*n-periodTime)%60!=0&&((periodTime*n)<=(24*60))){
System.out.println("间隔时间为:"+(periodTime*n));
n++;
}
System.out.println("倍数为:"+n+" 目标时间分钟数为:"+(n*periodTime));
//周期时间,每个相邻时间点的间隔分钟为periodTime,每个cron的周期时间为cycleTime
int cycleTime=(n-1)*periodTime;
//确定周期
for(int i=1;i<n;i++){
//1个半小时
// "0 30 1/3 * * ?" 1:30,4:30,7:30..
// "0 0 0/3 * * ?" 0:00,3:00,6:00..
int itemHour=(periodTime*i)/60;
int itemMins=(periodTime*i)%60;
if((itemHour-(cycleTime/60))==0)itemHour=0; //确保从0点开始
String cronItem="0 "+itemMins+" "+itemHour+"/"+(cycleTime/60)+" * * ?";
System.out.println("item的cron表达式是:"+cronItem);
cronList.add(cronItem);
}
return cronList;
}
}
//间隔小于1小时情况(这部分代码不完整,需要自行仿照上面的小时判断改写,这里只是单纯的在每小时内保持了执行周期)
if(periodTime<60&&periodTime>0)
{
//cron="0 0/1 * * * ?" 从0分钟开始,每1分钟执行一次
cronStr="0 0/"+periodTime+" * * * ?";
cronList.add(cronStr);
return cronList;
}
cronList.add(cronStr);
return cronList;
}