解析定时任务获取今日待执行任务

用户使用Linux中的crontab工具定制定时任务,时间段的格式minute hour day month week

其中数字范围如下(包含首尾两个数字):
minute:分钟,数字范围0-59;
hour:小时,数字范围0-23;
day:日期,数字范围1-31;
month:月份,数字范围1-12;
week:星期,数字范围0-6,0代表星期天,1代表星期一(未考虑7也代表星期天)。

除了数字,还可以包含特殊符号:
“*”:代表所有取值范围内的数字
“/”:代表每间隔多久
“-”:代表可以取两个数字之间的值,包括两个数字本身
“,”:代表取所有分开的离散数字

举例:
0 11 * * 1-3 表示每周一到周三的早上11点
0 2-12/2,19 * * * 表示2点到12点之间每两个小时和下午7点

/* 获取今日待执行任务 */
@RequestMapping("getTodayUnexecutedTask")
@ResponseBody
public List getTodayUnexecutedTask() {
    Calendar cal=Calendar.getInstance();
    // 2019-08-26 09:04 星期一
    int minute=cal.get(Calendar.MINUTE); // 4
    int hour=cal.get(Calendar.HOUR_OF_DAY); // 9
    int day=cal.get(Calendar.DATE); // 26
    int month=cal.get(Calendar.MONTH)+1; // 8
    int week=cal.get(Calendar.DAY_OF_WEEK)-1; // 1

    String nowTime=getTwoDigitTime(hour)+":"+getTwoDigitTime(minute); // 当前时间,格式为HH:ss
    int[] nowDate={day,month,week};

    List objs = new ArrayList();
    syslogrecord.recordSysLog("Task","定时任务","查询定时任务","");
    try {
        List list = taskService.findAllTask(); // 查询定时任务列表
        if(list!=null){
            for (TaskBean bean : list) {
                String[] runTimeSplit=bean.getRunTime().trim().split(" +"); // 将run-time用空格分隔

                if(runTimeSplit.length==2){ // 如果是单次执行,runTimeSplit格式为23:00 2019-8-28,分隔后长度为2
                    String[] date=runTimeSplit[1].split("-");
                    int m=Integer.parseInt(date[1]);
                    int d=Integer.parseInt(date[2]);
                    if(m==month&&d==day){ // 如果日期等于今天
                        if(runTimeSplit[0].compareTo(nowTime)>0){ // 如果时间在当前时间之后
                            objs.add(runTimeSplit[0]+" "+bean.getOa()+" "+bean.getType()+" "+bean.getJobName());
                        }
                    }
                    continue;
                }

                // 除单次执行外,其它定时任务的run-time格式均是linux定时任务的格式
                // Linux crontab定时任务的格式: [分] [小时] [日] [月] [周]
                boolean flag=true; // [日] [月] [周]是否是今天
                for(int i=2;i minutes = getNumList(runTimeSplit[0],59);
                    List hours = getNumList(runTimeSplit[1],23);

                    // 将每个小时和每个分钟数组合为时间字符串,与当前时间进行对比
                    for (int i=0; i0) { // 如果时间在当前时间之后
                                objs.add(timeStr+" "+bean.getOa()+" "+bean.getType()+" "+bean.getJobName());
                            }
                        }
                    }
                }
            }
        }
        Collections.sort(objs); // 按时间先后顺序排序
        return objs;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

/* 传入int型小时或分钟,返回两位字符串 */
private String getTwoDigitTime(int num){
    if(num<10){
        return "0"+num;
    }else{
        return ""+num;
    }
}

/*
 *  定时任务除了数字,还可以包含特殊符号“* / - ,”
 *  *代表所有取值范围内的数字,/代表每间隔多久,-代表可以取两个数字之间的值,包括两个数字本身,,代表取所有分开的离散数字
 *  参数str是“* / - ,”组成的字符串,用,分隔后,可能的情况有5种:*  * /3  2-10 2-10/3  纯数字
 *  求参数num是否包含在这些符号表达的数字集合中
 */
private boolean isContainNum(String str,int num){
    boolean flag=false;

    String[] strByComma=str.split(",");
    for(int i=0;i= min && num <= max && (num-min)%divisor == 0) {
                flag = true;
                break;
            }
        }
    }
    return flag;
}

/*
 *  定时任务除了数字,还可以包含特殊符号“* / - ,”
 *  *代表所有取值范围内的数字,/代表每间隔多久,-代表可以取两个数字之间的值,包括两个数字本身,,代表取所有分开的离散数字
 *  参数str是“* / - ,”组成的字符串,用,分隔后,可能的情况有5种:*  * /3  2-10 2-10/3  纯数字
 *  参数maxValue是最大值,最小值默认为0
 *  求每种情况的最小值、最大值和被除数,求出符合该范围的整数列表
 */
private List getNumList(String str,int maxValue) {
    List objs = new ArrayList();

    String[] strByComma=str.split(",");
    for(int i=0;i

 

你可能感兴趣的:(2.1,Java基础--练习,how2j.cn,毕向东)