2011-05-12 108 views
2

我需要一個Java代碼來創建一個基於用戶輸入的cron表達式。 用戶輸入是時間,頻率和執行次數。有沒有用於創建Cron Expression的Java代碼?

+0

cron表達式格式看起來很簡單。我懷疑Java本身是否支持Unix功能的代碼。我也不會建議導入任何庫,只是爲了獲得或多或少是一行代碼的代碼(如果您真的需要創建表達式...)。爲什麼不看一下格式,並簡單地創建代碼來輸出這種格式的字符串? http://en.wikipedia.org/wiki/Cron#Format – 2011-05-12 05:56:00

+0

你可以從[這個實現]有想法(http://www.techdive.in/java/java-create-cron-expression) – 2011-05-12 06:07:12

回答

5

只需從自己創建的註釋中添加即可。

下面是一個示例:提示用戶輸入值並將它們傳遞給以下方法,Javadoc解釋了哪些值(取自http://en.wikipedia.org/wiki/Cron#Format)的允許值。

這是未經測試,並沒有驗證任何輸入字符串,但我相信你可以做到這一點。

/** 
* Generate a CRON expression is a string comprising 6 or 7 fields separated by white space. 
* 
* @param seconds mandatory = yes. allowed values = {@code 0-59 */, -} 
* @param minutes mandatory = yes. allowed values = {@code 0-59 */, -} 
* @param hours  mandatory = yes. allowed values = {@code 0-23 */, -} 
* @param dayOfMonth mandatory = yes. allowed values = {@code 1-31 */, - ? L W} 
* @param month  mandatory = yes. allowed values = {@code 1-12 or JAN-DEC */, -} 
* @param dayOfWeek mandatory = yes. allowed values = {@code 0-6 or SUN-SAT */, - ? L #} 
* @param year  mandatory = no. allowed values = {@code 1970–2099 */, -} 
* @return a CRON Formatted String. 
*/ 
private static String generateCronExpression(final String seconds, final String minutes, final String hours, 
              final String dayOfMonth, 
              final String month, final String dayOfWeek, final String year) 
{ 
    return String.format("%1$s %2$s %3$s %4$s %5$s %6$s %7$s", seconds, minutes, hours, dayOfMonth, month, dayOfWeek, year); 
} 

從這裏採取的Cron格式信息:http://en.wikipedia.org/wiki/Cron#Format

+0

謝謝愛德華茲I會嘗試這個。 – Priya 2011-05-12 08:48:34

+0

感謝您的方法,試圖在當前日期時間使用此方法生成cron表達式,得到以下錯誤:線程「AWT-EventQueue-0」中的異常java.lang.RuntimeException:CronExpression'? 50 11? 8?'是無效的,。 (CronScheduleBuilder.java:105) – user2176576 2014-09-15 06:21:15

+1

這對Quartz的CronExpression至少是行不通的。提交修改。 – 2015-04-14 13:15:47

4

您可以更改執行以下按您的需求。

import java.io.Serializable; 

public class CronExpressionCreator implements Serializable { 

    private static final long serialVersionUID = -1676663054009319677L; 

    public static void main(String[] args) { 
     CronExpressionCreator pCron = new CronExpressionCreator(); 
     pCron.setTime("12:00 PM"); 
     pCron.setMON(true); 
     pCron.setStartDate("12-05-2011"); 
     System.out.println(pCron.getCronExpression()); 
    } 


    public String getCronExpression() { 
     String time = getTime(); 
     String[] time1 = time.split("\\:"); 
     String[] time2 = time1[1].split("\\ "); 

     String hour = ""; 
     if (time2[1].equalsIgnoreCase("PM")) { 
      Integer hourInt = Integer.parseInt(time1[0]) + 12; 
      if (hourInt == 24) { 
       hourInt = 0; 
      } 
      hour = hourInt.toString(); 
     } else { 
      hour = time1[0]; 
     } 

     String minutes = time2[0]; 
     String cronExp = ""; 
     if (isRecurring()) { 
      String daysString = ""; 
      StringBuilder sb = new StringBuilder(800); 
      boolean moreConditions = false; 

      if (isSUN()) { 
       sb.append("SUN"); 
       moreConditions = true; 
      } 

      if (isMON()) { 
       if (moreConditions) { 
        sb.append(","); 
       } 
       sb.append("MON"); 
       moreConditions = true; 
      } 

      if (isTUE()) { 
       if (moreConditions) { 
        sb.append(","); 
       } 

       sb.append("TUE"); 
       moreConditions = true; 
      } 

      if (isWED()) { 
       if (moreConditions) { 
        sb.append(","); 
       } 

       sb.append("WED"); 
       moreConditions = true; 
      } 

      if (isTHU()) { 
       if (moreConditions) { 
        sb.append(","); 
       } 
       sb.append("THU"); 
       moreConditions = true; 
      } 

      if (isFRI()) { 
       if (moreConditions) { 
        sb.append(","); 
       } 
       sb.append("FRI"); 
       moreConditions = true; 
      } 

      if (isSAT()) { 
       if (moreConditions) { 
        sb.append(","); 
       } 
       sb.append("SAT"); 
       moreConditions = true; 
      } 

      daysString = sb.toString(); 

      cronExp = "0 " + minutes + " " + hour + " ? * " + daysString; 
     } else { 
      String startDate = getStartDate(); 
      String[] dateArray = startDate.split("\\-"); 
      String day = dateArray[0]; 
      if (day.charAt(0) == '0') { 
       day = day.substring(1); 
      } 

      String month = dateArray[1]; 

      if (month.charAt(0) == '0') { 
       month = month.substring(1); 
      } 

      String year = dateArray[2]; 
      cronExp = "0 " + minutes + " " + hour + " " + day + " " + month 
      + " ? " + year; 

     } 
     return cronExp; 
    } 

    String startDate; 
    String time; 
    boolean recurring; 
    boolean SUN; 
    boolean MON; 
    boolean TUE; 
    boolean WED; 
    boolean THU; 
    boolean FRI; 
    boolean SAT; 

    /** 
    * @return the startDate 
    */ 
    public String getStartDate() { 
     return startDate; 
    } 

    /** 
    * The date set should be of the format (MM-DD-YYYY for example 25-04-2011) 
    * 
    * @param startDate 
    *   the startDate to set 
    */ 
    public void setStartDate(String startDate) { 
     this.startDate = startDate; 
    } 

    /** 
    * @return the time 
    */ 
    public String getTime() { 
     return time; 
    } 

    /** 
    * The time set should be of the format (HH:MM AM/PM for example 12:15 PM) 
    * 
    * @param time 
    *   the time to set 
    */ 
    public void setTime(String time) { 
     this.time = time; 
    } 

    public boolean isRecurring() { 
     return recurring; 
    } 

    public void setRecurring(boolean recurring) { 
     this.recurring = recurring; 
    } 

    public boolean isSUN() { 
     return SUN; 
    } 

    public void setSUN(boolean sUN) { 
     SUN = sUN; 
    } 

    public boolean isMON() { 
     return MON; 
    } 

    /** 
    * @param mON 
    *   the mON to set 
    */ 
    public void setMON(boolean mON) { 
     MON = mON; 
    } 

    public boolean isTUE() { 
     return TUE; 
    } 

    public void setTUE(boolean tUE) { 
     TUE = tUE; 
    } 

    public boolean isWED() { 
     return WED; 
    } 

    public void setWED(boolean wED) { 
     WED = wED; 
    } 

    public boolean isTHU() { 
     return THU; 
    } 

    public void setTHU(boolean tHU) { 
     THU = tHU; 
    } 

    public boolean isFRI() { 
     return FRI; 
    } 

    public void setFRI(boolean fRI) { 
     FRI = fRI; 
    } 

    public boolean isSAT() { 
     return SAT; 
    } 

    public void setSAT(boolean sAT) { 
     SAT = sAT; 
    } 

    public int hashCode() { 
     return this.getCronExpression().hashCode(); 
    } 

    public boolean equals(Object obj) { 
     if (obj == null) { 
      return false; 
     } 
     if (obj instanceof CronExpressionCreator) { 
      if (((CronExpressionCreator) obj).getCronExpression() 
        .equalsIgnoreCase(this.getCronExpression())) { 
       return true; 
      } 
     } else { 
      return false; 
     } 
     return false; 

    } 

} 
2

The snippet submitted by edwardsmatt above在Quartz的CronExpression中無法正常工作。這裏有一個修正版本,那麼:

/** 
* Generate a CRON expression is a string comprising 6 or 7 fields separated by white space. 
* 
* @param seconds mandatory = yes. allowed values = {@code 0-59 */, -} 
* @param minutes mandatory = yes. allowed values = {@code 0-59 */, -} 
* @param hours  mandatory = yes. allowed values = {@code 0-23 */, -} 
* @param dayOfMonth mandatory = yes. allowed values = {@code 1-31 */, - ? L W} 
* @param month  mandatory = yes. allowed values = {@code 1-12 or JAN-DEC */, -} 
* @param dayOfWeek mandatory = yes. allowed values = {@code 0-6 or SUN-SAT */, - ? L #} 
* @param year  mandatory = no. allowed values = {@code 1970–2099 */, -} 
* @return a CRON Formatted String. 
*/ 
private static String generateCronExpression(final String seconds, final String minutes, final String hours, 
              final String dayOfMonth, 
              final String month, final String dayOfWeek, final String year) 
{ 
    return String.format("%1$s %2$s %3$s %4$s %5$s %6$s %7$s", seconds, minutes, hours, dayOfMonth, month, dayOfWeek, year); 
} 
1

我認爲你可以使用cron-utils,這帶來了CronBuilder類,並允許導出爲多種格式。該功能從版本4.0.0起可用。

從自述一個例子:

//Create a cron expression. CronMigrator will ensure you remain cron provider agnostic 
import static com.cronutils.model.field.expression.FieldExpressionFactory.*; 
Cron cron = CronBuilder.cron(CronDefinitionBuilder.instanceDefinitionFor(CronType.QUARTZ)) 
.withYear(always()) 
.withDoM(between(1, 3)) 
.withMonth(always()) 
.withDoW(questionMark()) 
.withHour(always()) 
.withMinute(always()) 
.withSecond(on(0)) 
.instance(); 
//Obtain the string expression 
String cronAsString = cron.asString();//0 * * 1-3 * ? * 
//Migrate to Unix format 
cron = CronMapper.fromQuartzToUnix().map(cron); 
cronAsString = cron.asString();//* * 1-3 * *