具有开始和结束时间的Cron表达式

时间:2016-06-15 09:59:20

标签: cron

我正在尝试每天写一个具有特定开始时间和结束时间的cron表达式。即 每天10:15至17:35每分钟

一种可能的解决方案是编写3个不同的cron表达式:

0 15-59 10 * * *
0 * 11-17 * * *
0 0-35 17 * * *

有没有办法在一个单独的cron表达式中写这个?

4 个答案:

答案 0 :(得分:0)

Quartz Scheduler C# 在几小时内完成工作

使用玉米面膜:

        ITrigger trigger_1 = TriggerBuilder.Create()
            .ForJob("YOUR_JOB")
            .WithIdentity("trigger_1")
            .StartAt(startTime)
            .WithCronSchedule("0 0/1 8-13 ? *   SUN,MON,TUE,WED,SAT *")
            .Build();

使用石英时间表:

trigger_1 = TriggerBuilder
            .Create()
            .ForJob("YOUR_JOB")
            .WithIdentity("trigger_1")
            .StartAt(startTime)
            .WithDailyTimeIntervalSchedule(c => c
                .OnEveryDay()
                .WithIntervalInMinutes(1).WithRepeatCount(1)
                .StartingDailyAt(new TimeOfDay(08, 30))
                .EndingDailyAt(new TimeOfDay(12, 30))
            )
            .Build();

答案 1 :(得分:0)

   HashMap<String, String> weekday = new HashMap<>();
    // String strDays ="[Monday, Friday]";
    String strCalDay = "";

    String startDate[] = fromDate.split("-");
    String endDate[] = toDate.split("-");

    weekday.put("MONDAY", "1");
    weekday.put("TUESDAY", "2");
    weekday.put("WEDNESDAY", "3");
    weekday.put("THURSDAY", "4");
    weekday.put("FRIDAY", "5");
    weekday.put("SATURDAY", "6");
    weekday.put("SUNDAY", "7");

    strDays = strDays.replace("[", "").replace("]", "");
    String strDay[] = strDays.trim().toUpperCase().split(",");
    if (strDay != null && strDay.length > 0) {
        for (int i = 0; i < strDay.length; i++) {
            strCalDay = strCalDay + "," + weekday.get(strDay[i].trim().replace("\"", ""));
        }
        // System.out.println(" No of days :: "+ strCalDay);
        strCalDay = strCalDay.replaceFirst(",", "");
        //System.out.println(" No of days :: "+ strCalDay);
    }


    Calendar startCal = Calendar.getInstance(TimeZone.getDefault());
    Calendar endCal = Calendar.getInstance(TimeZone.getDefault());
    startCal.set(Integer.parseInt(startDate[0].toString()),
            Integer.parseInt(startDate[1].toString()),
            Integer.parseInt((startDate[2].toString())));

    endCal.set(Integer.parseInt(endDate[0].toString()),
            Integer.parseInt(endDate[1].toString()),
            Integer.parseInt((endDate[2].toString())));

    int yearsInBetween = endCal.get(Calendar.YEAR) - startCal.get(Calendar.YEAR);
    int monthsDiff = endCal.get(Calendar.MONTH) - startCal.get(Calendar.MONTH);
    long ageInMonths = yearsInBetween * 12 + monthsDiff;
    System.out.println("  ageInMonths: " + ageInMonths);


    if (startCal.get(Calendar.MONTH) != endCal.get(Calendar.MONTH)) {
        if (ageInMonths == 3) {
            Calendar middleMonth1 = (Calendar) startCal.clone();
            middleMonth1.add(Calendar.MONTH, 1);
            Calendar middleMonth2 = (Calendar) startCal.clone();
            middleMonth2.add(Calendar.MONTH, 2);

            int getFirstMMonth = middleMonth1.get(Calendar.MONTH);
            int getSecMMonth = middleMonth2.get(Calendar.MONTH);
            if (getFirstMMonth == 0) {
                getFirstMMonth = 12;
                System.out.println("  getFirstMMonth : " + getFirstMMonth);
            }
            if (getSecMMonth == 0) {
                getSecMMonth = 12;
                // System.out.println("  getSecMMonth : " +getSecMMonth );
            }
            exp = strTimeMin + " " + strTime + " " + startDate[2] + "-" + "31,1-31,1-31,1-" + endDate[2] + " " +
                    startDate[1] + "," + getFirstMMonth + "," + getSecMMonth + "," + endDate[1] + " *";

            //  System.out.println("  expression for   month3 : " + exp);
        }
        if (ageInMonths == 2) {
            Calendar middleMonth1 = (Calendar) startCal.clone();
            middleMonth1.add(Calendar.MONTH, 1);
            //System.out.println("  get middleDate month : " + middleMonth1.get(Calendar.MONTH));
            int getMiddleMonth = middleMonth1.get(Calendar.MONTH);
            if (getMiddleMonth == 0) {
                getMiddleMonth = 12;
                //  System.out.println("  getMiddleMonth : " +getMiddleMonth );
            }
            //  System.out.println("  Outside getMiddleMonth : " +getMiddleMonth );


            endCal.set(Calendar.MONTH, 11);
            //System.out.println("  get middleDate month 001: " + endCal.get(Calendar.MONTH));

            exp = strTimeMin + " " + strTime + " " + startDate[2] + "-" + "31,1-31,1-" +
                    endDate[2] + " " + startDate[1] + "," +
                    getMiddleMonth + "," + endDate[1] + " *";
            // System.out.println("  get end  month2 : " + exp);
        } else if (ageInMonths == 1) {

            exp = strTimeMin + " " + strTime + " " + startDate[2] + "-31,1-" +
                    endDate[2] + " " + startDate[1] + "," + endDate[1] + " *";
            //System.out.println("  expression for  one month : " + exp);
        }

    } else {

        exp = strTimeMin + " " + strTime + " " + startDate[2] + "-" + endDate[2] + " " + endDate[1] + " *";
    }

    System.out.println("  expression for  before parameter : " + exp);

    //Run with only Start Date
    if (strRepeat != null && strRepeat.equalsIgnoreCase("No")) {
        exp = strTimeMin + " " + strTime + " " + startDate[2] + " " + startDate[1] + " *";
    } else if (strRepeat != null && strRepeat.equalsIgnoreCase("Daily")) {
        exp = exp;
    } else if (strRepeat != null && strRepeat.equalsIgnoreCase("Weekdays")) {


        // System.out.println("  expression for  weekdays before  : " + exp);
        exp = exp.replace("*", strCalDay);
        // System.out.println("  expression for  weekdays after  : " + exp);


    } else if (strRepeat != null && strRepeat.equalsIgnoreCase("Weekends")) {

        // System.out.println("  expression for  weekend  before  : " + exp);
        exp = exp.replace("*", "6,7");
        // System.out.println("  expression for  weekend after  : " + exp);
    }
    System.out.println(" cron expression ::: " + exp);

答案 2 :(得分:0)

没有其他方法可以使用单个crone表达式来实现它,而是为特定的startDate和endDate指定多个crone表达式。 不过,第二个crone的表达略有修改(突出显示的一个)

0 15-59 10 * * *(10:15 AM和10:59 AM之间的每分钟)

0 * 11-16 * * *(每分钟,从11:00 AM到04:59 PM)

0 0-35 17 * * *(05:00 PM和05:35 PM之间的每分钟)

答案 3 :(得分:-1)

是的,请使用

0 15-35 10-17 1/1 * ? *

您可以按照本教程http://www.quartz-scheduler.org/documentation/quartz-2.x/tutorials/crontrigger.html

进行操作

在此处生成并测试您的表达式http://www.cronmaker.com/