因为玩cron有一段时间,长久以来困扰我的一个问题: 怎么用cron实现40分钟执行一次?
之前用了几种实现方案:
0 0/40 * * * ?
0 40-40 * * * ?
0 */40 * * * ?
但是都不能实现。
一次想到在技术群里问一下,然后一个大神给了一个链接:
How do set cron to run my script every 40mins/25mins? - Stack Overflow
原来早就有人遇到过,这种问题需要使用组合表达式。
文中给出了两个表达式:
20 1,3,5,7,9,11,13,15,17,19,21,23 * * * ?
0,40 */2 * * * ?
最终总结出的表达式:
0 0,40 0/2 * * ? *
0 20 1,3,5,7,9,11,13,15,17,19,21,23 * * ?
按照上面的任务执行下来是这个样子的:
12:40 -->走第1个表达式
13:20 -->走第2个表达式
14:00 -->走第1个表达式
14:40 -->走第1个表达式
15:20 -->走第2个表达式
16:00 -->走第1个表达式
至此问题解决!
上面大神给出的链接中还有一个是关于25分钟执行一次的,也会遇到这种无法一个cron表达式处理的问题,感兴趣的可以进链接看看。
那么,如果是35分钟,45分钟呢?
我写了一段js代码,用于判断一个时间间隔需要多少个表达式,有需要的可以拿去:
// js判断n分钟执行的循环次数,跨越的小时数(每小时单独一个表达式)
var basedate = new Date('2020/09/12 00:00');
var date = new Date('2020/09/12 00:00');
console.log("date: " + date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds());
var num = 45; //时间间隔:分钟
for (var i = 1; i <= 121; i++) {
date.setMinutes(date.getMinutes() + num);
console.log("date: " + date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds());
if (date.getMinutes() == basedate.getMinutes()) {
console.log("---如果是每隔" + num +"分钟执行一次,循环第" + i + "次进入重新循环,跨越" + (date.getHours() - basedate.getHours()) + "个小时,所以需要" + (date.getHours() - basedate.getHours()) + "个表达式才能完成---");
break;
}
}
Js放到浏览器的Console控制台执行一下,就可以看到结果了: