Cron expression with start and end time

后端 未结 4 1889
南笙
南笙 2021-01-19 00:15

I am trying to write an cron expression with a specific start time and end time everyday. i.e. every minute from 10:15 to 17:35 everyday

One possible solution for t

相关标签:
4条回答
  • 2021-01-19 00:45
       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);
    
    0 讨论(0)
  • 2021-01-19 00:55

    Quartz Scheduler c# run job between to hours

    use corn mask:

            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();
    

    use Quartz Schedule:

    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();
    
    0 讨论(0)
  • 2021-01-19 01:01

    yes, use

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

    you can follow this tutorial http://www.quartz-scheduler.org/documentation/quartz-2.x/tutorials/crontrigger.html

    and generate and test your expressions here http://www.cronmaker.com/

    0 讨论(0)
  • 2021-01-19 01:08

    There is no other way to achieve it using single crone expression but to specify multiple crone expressions for specific startDate and endDate. There is a slight modification in second crone expression though (highlighted one)

    0 15-59 10 * * * (Every minute between 10:15 AM and 10:59 AM)

    0 * 11-16 * * * (Every minute, between 11:00 AM and 04:59 PM)

    0 0-35 17 * * * (Every minute between 05:00 PM and 05:35 PM)

    0 讨论(0)
提交回复
热议问题