cron表達式的生成與解析


/**
 * Cron表達式工具類:目前支持三種常用的cron表達式
 * 1.每天的某個時間點執行      例:12 12 12 * * ?表示每天12時12分12秒執行
 * 2.每周的哪幾天執行         例:12 12 12 ? * 1,2,3表示每周的周1周2周3 ,12時12分12秒執行
 * 3.每月的哪幾天執行         例:12 12 12 1,21,13 * ?表示每月的1號21號13號 12時12分12秒執行
 *
 * @Author 法哈席基
 */
public class CronUtil {

    /**
     * 方法摘要:構建Cron表達式
     *
     * @param jobScheduleModel
     * @return String
     */
    public static String createCronExpression(JobScheduleModel jobScheduleModel) {
        StringBuffer cronExp = new StringBuffer("");

        if (null == jobScheduleModel.getJobType()) {
            System.out.println("執行周期未配置");
        }

        if (null != jobScheduleModel.getSecond()
                && null != jobScheduleModel.getMinute()
                && null != jobScheduleModel.getHour()) {
            //
            cronExp.append(jobScheduleModel.getSecond()).append(" ");
            //
            cronExp.append(jobScheduleModel.getMinute()).append(" ");
            // 小時
            cronExp.append(jobScheduleModel.getHour()).append(" ");

            // 每天
            if (jobScheduleModel.getJobType().intValue() == JobConstants.JOB_TYPE_DAY) {
                //
                cronExp.append("* ")
                        //
                        .append("* ")
                        //
                        .append("?");
            }

            // 按每周
            else if (jobScheduleModel.getJobType().intValue() == JobConstants.JOB_TYPE_WEEK) {
                // 一個月中第幾天
                cronExp.append("? ")
                // 月份
                .append("* ");
                //
                Integer[] weeks = jobScheduleModel.getDayOfWeeks();
                for (int i = 0; i < weeks.length; i++) {
                    if (i == 0) {
                        cronExp.append(weeks[i]);
                    } else {
                        cronExp.append(",").append(weeks[i]);
                    }
                }

            }

            // 按每月
            else if (jobScheduleModel.getJobType().intValue() == JobConstants.JOB_TYPE_MONTH) {
                // 一個月中的哪幾天
                Integer[] days = jobScheduleModel.getDayOfMonths();
                for (int i = 0; i < days.length; i++) {
                    if (i == 0) {
                        cronExp.append(days[i]);
                    } else {
                        cronExp.append(",").append(days[i]);
                    }
                }
                // 月份
                cronExp.append(" * ")
                //
                .append("?");
            }

        } else {
            // 時或分或秒參數未配置
            System.out.println("時或分或秒參數未配置");
        }
        return cronExp.toString();
    }

    /**
     * 方法摘要:生成計划的詳細描述
     *
     * @param jobScheduleModel
     * @return String
     */
    public static String createDescription(JobScheduleModel jobScheduleModel) {
        StringBuffer description = new StringBuffer("");
        // 計划執行開始時間
//      Date startTime = taskScheduleModel.getScheduleStartTime();

        if (null != jobScheduleModel.getSecond()
                && null != jobScheduleModel.getMinute()
                && null != jobScheduleModel.getHour()) {
            // 按每天
            if (jobScheduleModel.getJobType().intValue() == 1) {
                description.append("每天");
                description.append(jobScheduleModel.getHour()).append("時");
                description.append(jobScheduleModel.getMinute()).append("分");
                description.append(jobScheduleModel.getSecond()).append("秒");
                description.append("執行");
            }

            // 按每周
            else if (jobScheduleModel.getJobType().intValue() == 2) {
                if (jobScheduleModel.getDayOfWeeks() != null && jobScheduleModel.getDayOfWeeks().length > 0) {
                    String days = "";
                    for (int i : jobScheduleModel.getDayOfWeeks()) {
                        days += "周" + i;
                    }
                    description.append("每周的").append(days).append(" ");
                }
                if (null != jobScheduleModel.getSecond()
                        && null != jobScheduleModel.getMinute()
                        && null != jobScheduleModel.getHour()) {
                    description.append(",");
                    description.append(jobScheduleModel.getHour()).append("時");
                    description.append(jobScheduleModel.getMinute()).append("分");
                    description.append(jobScheduleModel.getSecond()).append("秒");
                }
                description.append("執行");
            }

            // 按每月
            else if (jobScheduleModel.getJobType().intValue() == 3) {
                // 選擇月份
                if (jobScheduleModel.getDayOfMonths() != null && jobScheduleModel.getDayOfMonths().length > 0) {
                    String days = "";
                    for (int i : jobScheduleModel.getDayOfMonths()) {
                        days += i + "號";
                    }
                    description.append("每月的").append(days).append(" ");
                }
                description.append(jobScheduleModel.getHour()).append("時");
                description.append(jobScheduleModel.getMinute()).append("分");
                description.append(jobScheduleModel.getSecond()).append("秒");
                description.append("執行");
            }

        }
        return description.toString();
    }

    // demo
    public static void main(String[] args) {
        // 執行時間:每天的12時12分12秒 start
        JobScheduleModel jobScheduleModel = new JobScheduleModel();
        jobScheduleModel.setJobType(1);// 按每天
        Integer hour = 12; // 
        Integer minute = 12; // 
        Integer second = 12; // 
        jobScheduleModel.setHour(hour);
        jobScheduleModel.setMinute(minute);
        jobScheduleModel.setSecond(second);
        String cropExp = createCronExpression(jobScheduleModel);
        System.out.println(cropExp + ":" + createDescription(jobScheduleModel));
        // 執行時間:每天的12時12分12秒 end

        jobScheduleModel.setJobType(2);// 每周的哪幾天執行
        Integer[] dayOfWeeks = new Integer[3];
        dayOfWeeks[0] = 1;
        dayOfWeeks[1] = 2;
        dayOfWeeks[2] = 3;
        jobScheduleModel.setDayOfWeeks(dayOfWeeks);
        cropExp = createCronExpression(jobScheduleModel);
        System.out.println(cropExp + ":" + createDescription(jobScheduleModel));

        jobScheduleModel.setJobType(3);// 每月的哪幾天執行
        Integer[] dayOfMonths = new Integer[3];
        dayOfMonths[0] = 1;
        dayOfMonths[1] = 21;
        dayOfMonths[2] = 13;
        jobScheduleModel.setDayOfMonths(dayOfMonths);
        cropExp = createCronExpression(jobScheduleModel);
        System.out.println(cropExp + ":" + createDescription(jobScheduleModel));

    }
}
import lombok.Data;

/**
 * 任務調度實體
 *
 * @Author 法哈席基
 */
@Data
public class JobScheduleModel {
    /**
     * 執行周期類型:
     * 1  -> 每天
     * 2  -> 每周
     * 3  -> 每月
     * 4  ->間隔(每隔2個小時,每隔30分鍾)
     */
    private Integer jobType;

    /**
     * 一周的哪幾天
     */
    private Integer[] dayOfWeeks;

    /**
     * 一個月的哪幾天
     */
    private Integer[] dayOfMonths;

    /**
     * 秒
     */
    private Integer second;

    /**
     * 分
     */
    private Integer minute;

    /**
     * 時
     */
    private Integer hour;
}
/**
* 任務常量
* * @Author 法哈席基 */ public interface JobConstants { /** * 【執行周期】1:每日、2:每周、3:每月 */ int JOB_TYPE_DAY = 1; int JOB_TYPE_WEEK = 2; int JOB_TYPE_MONTH = 3; }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM