cron表达式生成函数(小时部分自定义) 1小时30分钟,1小时20分钟,1小时40分钟..

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;
    }
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值