Cron表达式工具类CronUtil
构建Cron表达式
public static String createCronExpression ( TaskScheduleModel taskScheduleModel) {
StringBuffer cronExp = new StringBuffer ( "" ) ;
if ( null == taskScheduleModel. getJobType ( ) ) {
System . out. println ( "执行周期未配置" ) ;
}
if ( null != taskScheduleModel. getSecond ( )
&& null != taskScheduleModel. getMinute ( )
&& null != taskScheduleModel. getHour ( ) ) {
cronExp. append ( taskScheduleModel. getSecond ( ) ) . append ( " " ) ;
cronExp. append ( taskScheduleModel. getMinute ( ) ) . append ( " " ) ;
cronExp. append ( taskScheduleModel. getHour ( ) ) . append ( " " ) ;
if ( taskScheduleModel. getJobType ( ) . getValue ( ) == 1 ) {
if ( taskScheduleModel. getBeApart ( ) != null ) {
cronExp. append ( "1" ) ;
cronExp. append ( "/" ) ;
cronExp. append ( taskScheduleModel. getBeApart ( ) + 1 ) ;
cronExp. append ( " " ) ;
cronExp. append ( "* " ) ;
cronExp. append ( "? " ) ;
cronExp. append ( "*" ) ;
} else {
cronExp. append ( "* " ) ;
cronExp. append ( "* " ) ;
cronExp. append ( "?" ) ;
}
}
else if ( taskScheduleModel. getJobType ( ) . getValue ( ) == 3 ) {
cronExp. append ( "? " ) ;
cronExp. append ( "* " ) ;
Integer [ ] weeks = taskScheduleModel. getDayOfWeeks ( ) ;
for ( int i = 0 ; i < weeks. length; i++ ) {
if ( i == 0 ) {
cronExp. append ( weeks[ i] ) ;
} else {
cronExp. append ( "," ) . append ( weeks[ i] ) ;
}
}
}
else if ( taskScheduleModel. getJobType ( ) . getValue ( ) == 2 ) {
Integer [ ] days = taskScheduleModel. getDayOfMonths ( ) ;
for ( int i = 0 ; i < days. length; i++ ) {
if ( i == 0 ) {
if ( days[ i] == 32 ) {
String endMouthCron= "0 0 0 L * ?" ;
return endMouthCron;
} else {
cronExp. append ( days[ i] ) ;
}
} else {
cronExp. append ( "," ) . append ( days[ i] ) ;
}
}
cronExp. append ( " * " ) ;
cronExp. append ( "?" ) ;
}
else if ( taskScheduleModel. getJobType ( ) . getValue ( ) == 4 ) {
Integer [ ] days = taskScheduleModel. getDayOfMonths ( ) ;
if ( ArrayUtil . isEmpty ( days) ) {
cronExp. append ( "*" ) ;
} else {
for ( int i = 0 ; i < days. length; i++ ) {
if ( i == 0 ) {
cronExp. append ( days[ i] ) ;
} else {
cronExp. append ( "," ) . append ( days[ i] ) ;
}
}
}
Integer [ ] months = taskScheduleModel. getMonths ( ) ;
if ( ArrayUtil . isEmpty ( months) ) {
cronExp. append ( " *" ) ;
} else {
for ( int i = 0 ; i < months. length; i++ ) {
Integer month = months[ i] ;
if ( month > 12 ) {
throw new RuntimeException ( "月份数据异常: " + Arrays . toString ( months) ) ;
}
if ( i == 0 ) {
cronExp. append ( " " ) . append ( month) ;
} else {
cronExp. append ( "," ) . append ( month) ;
}
}
}
cronExp. append ( " ?" ) ;
}
else if ( taskScheduleModel. getJobType ( ) . getValue ( ) == 0 ) {
cronExp. append ( "* " ) ;
cronExp. append ( "* " ) ;
cronExp. append ( "?" ) ;
}
}
else {
System . out. println ( "时或分或秒参数未配置" ) ;
}
return cronExp. toString ( ) ;
}
生成计划的详细描述
public static String createDescription ( TaskScheduleModel taskScheduleModel) {
StringBuffer description = new StringBuffer ( "" ) ;
if ( null != taskScheduleModel. getSecond ( )
&& null != taskScheduleModel. getMinute ( )
&& null != taskScheduleModel. getHour ( ) ) {
if ( taskScheduleModel. getJobType ( ) . getValue ( ) == 1 ) {
description. append ( "每天" ) ;
description. append ( taskScheduleModel. getHour ( ) ) . append ( "时" ) ;
description. append ( taskScheduleModel. getMinute ( ) ) . append ( "分" ) ;
description. append ( taskScheduleModel. getSecond ( ) ) . append ( "秒" ) ;
}
else if ( taskScheduleModel. getJobType ( ) . getValue ( ) == 3 ) {
if ( taskScheduleModel. getDayOfWeeks ( ) != null && taskScheduleModel. getDayOfWeeks ( ) . length > 0 ) {
String days = "" ;
for ( int i : taskScheduleModel. getDayOfWeeks ( ) ) {
if ( i== 1 ) {
days += "周日" ;
} else {
i= i- 1 ;
days += "周" + i;
}
}
description. append ( "每周的" ) . append ( days) . append ( " " ) ;
}
if ( null != taskScheduleModel. getSecond ( )
&& null != taskScheduleModel. getMinute ( )
&& null != taskScheduleModel. getHour ( ) ) {
description. append ( "," ) ;
description. append ( taskScheduleModel. getHour ( ) ) . append ( "时" ) ;
description. append ( taskScheduleModel. getMinute ( ) ) . append ( "分" ) ;
description. append ( taskScheduleModel. getSecond ( ) ) . append ( "秒" ) ;
}
}
else if ( taskScheduleModel. getJobType ( ) . getValue ( ) == 2 ) {
if ( taskScheduleModel. getDayOfMonths ( ) != null && taskScheduleModel. getDayOfMonths ( ) . length > 0 ) {
String days = "" ;
for ( int i : taskScheduleModel. getDayOfMonths ( ) ) {
days += i + "号" ;
}
description. append ( "每月的" ) . append ( days) . append ( " " ) ;
}
description. append ( taskScheduleModel. getHour ( ) ) . append ( "时" ) ;
description. append ( taskScheduleModel. getMinute ( ) ) . append ( "分" ) ;
description. append ( taskScheduleModel. getSecond ( ) ) . append ( "秒" ) ;
}
}
return description. toString ( ) ;
}
构建Cron表达式
public static String createLoopCronExpression ( int rate, int cycle) {
String cron = "" ;
switch ( rate) {
case 0 : / / 每cycle秒执行一次
cron = "0/" + cycle + " * * * * ?" ;
break ;
case 1 : / / 每cycle分钟执行一次
cron = "0 0/" + cycle + " * * * ?" ;
break ;
case 2 : / / 每cycle小时执行一次
cron = "0 0 0/" + cycle + " * * ?" ;
break ;
case 3 : / / 每cycle天的0 点执行一次
cron = "0 0 0 1/" + cycle + " * ?" ;
break ;
case 4 : / / 每cycle月的1 号0 点执行一次
cron = "0 0 0 1 1/" + cycle + " ? " ;
break ;
case 5 : / / 每天cycle点执行一次
cron = "0 0 " + cycle+ " * * ?" ;
break ;
default : / / 默认每cycle秒执行一次
cron = "0/1 * * * * ?" ;
break ;
}
return cron;
}
枚举类
public enum JobEnum {
EVERY ( "每天" , 0 ) ,
DAY ( "日" , 1 ) ,
MONTH ( "月" , 2 ) ,
WEEK ( "周" , 3 ) ,
YEAR ( "年" , 4 ) ,
;
JobEnum ( String name, Integer value) {
this . name = name;
this . value = value;
}
private final String name;
private final Integer value;
public Integer getValue ( ) {
return value;
}
public String getName ( ) {
return name;
}
}
TaskScheduleModel
public class TaskScheduleModel {
JobEnum jobType;
Integer [ ] dayOfWeeks;
Integer [ ] dayOfMonths;
Integer second;
Integer minute;
Integer hour;
Integer [ ] months;
Integer beApart;
public Integer [ ] getMonths ( ) {
return months;
}
public void setMonths ( Integer [ ] months) {
this . months = months;
}
public Integer getBeApart ( ) {
return beApart;
}
public void setBeApart ( Integer beApart) {
this . beApart = beApart;
}
public JobEnum getJobType ( ) {
return jobType;
}
public void setJobType ( JobEnum jobType) {
this . jobType = jobType;
}
public Integer [ ] getDayOfWeeks ( ) {
return dayOfWeeks;
}
public void setDayOfWeeks ( Integer [ ] dayOfWeeks) {
this . dayOfWeeks = dayOfWeeks;
}
public Integer [ ] getDayOfMonths ( ) {
return dayOfMonths;
}
public void setDayOfMonths ( Integer [ ] dayOfMonths) {
this . dayOfMonths = dayOfMonths;
}
public Integer getSecond ( ) {
return second;
}
public void setSecond ( Integer second) {
this . second = second;
}
public Integer getMinute ( ) {
return minute;
}
public void setMinute ( Integer minute) {
this . minute = minute;
}
public Integer getHour ( ) {
return hour;
}
public void setHour ( Integer hour) {
this . hour = hour;
}
}
测试
public static void main ( String [ ] args) {
TaskScheduleModel taskScheduleModel = new TaskScheduleModel ( ) ;
taskScheduleModel. setJobType ( JobEnum . DAY ) ;
Integer hour = 17 ;
Integer minute = 40 ;
Integer second = 00 ;
taskScheduleModel. setHour ( hour) ;
taskScheduleModel. setMinute ( minute) ;
taskScheduleModel. setSecond ( second) ;
taskScheduleModel. setBeApart ( 1 ) ;
String cropExp = createCronExpression ( taskScheduleModel) ;
System . out. println ( cropExp + ":" + createDescription ( taskScheduleModel) ) ;
taskScheduleModel. setJobType ( JobEnum . WEEK ) ;
Integer [ ] dayOfWeeks = new Integer [ 7 ] ;
dayOfWeeks[ 0 ] = 1 ;
dayOfWeeks[ 1 ] = 2 ;
dayOfWeeks[ 2 ] = 3 ;
dayOfWeeks[ 3 ] = 4 ;
dayOfWeeks[ 4 ] = 5 ;
dayOfWeeks[ 5 ] = 6 ;
dayOfWeeks[ 6 ] = 7 ;
taskScheduleModel. setDayOfWeeks ( dayOfWeeks) ;
cropExp = createCronExpression ( taskScheduleModel) ;
System . out. println ( cropExp + ":" + createDescription ( taskScheduleModel) ) ;
taskScheduleModel. setJobType ( JobEnum . MONTH ) ;
Integer [ ] dayOfMonths = new Integer [ 3 ] ;
dayOfMonths[ 0 ] = 1 ;
dayOfMonths[ 1 ] = 21 ;
dayOfMonths[ 2 ] = 13 ;
taskScheduleModel. setDayOfMonths ( dayOfMonths) ;
cropExp = createCronExpression ( taskScheduleModel) ;
System . out. println ( cropExp + ":" + createDescription ( taskScheduleModel) ) ;
taskScheduleModel. setJobType ( JobEnum . EVERY ) ;
cropExp = createCronExpression ( taskScheduleModel) ;
System . out. println ( cropExp) ;
}
0 40 17 1 / 2 * ? * : 每天17 时40 分0 秒
0 40 17 ? * 1 , 2 , 3 , 4 , 5 , 6 , 7 : 每周的周日周1 周2 周3 周4 周5 周6 , 17 时40 分0 秒
0 40 17 1 , 21 , 13 * ? : 每月的1 号21 号13 号 17 时40 分0 秒
0 40 17 * * ?
第二种解析方式
public class DateTimeToCronUtils {
public static final String YEAR = "ss mm HH dd MM ? yyyy" ;
public static final String MONDAY = "ss mm HH ? * 1" ;
public static final String TUESDAY = "ss mm HH ? * 2" ;
public static final String WEDNESDAY = "ss mm HH ? * 3" ;
public static final String THURSDAY = "ss mm HH ? * 4" ;
public static final String FRIDAY = "ss mm HH ? * 5" ;
public static final String SATURDAY = "ss mm HH ? * 6" ;
public static final String SUNDAY = "ss mm HH ? * 7" ;
public static final String EVERYDAY = "ss mm HH * * ?" ;
public static final String INTERVAL_DAY = "0 0 0 1/param * ? " ;
public static final String INTERVAL_HOUR = "0 0 0/param * * ?" ;
public static final String INTERVAL_MINUTE = "0 0/param * * * ? " ;
public static String formatDateByPattern ( LocalDateTime date, String dateFormat) {
return DateUtil . format ( date, dateFormat) ;
}
public static String formatDateByPattern ( Date date, String dateFormat) {
SimpleDateFormat sdf = new SimpleDateFormat ( dateFormat) ;
String formatTimeStr = null ;
if ( date != null ) {
formatTimeStr = sdf. format ( date) ;
}
return formatTimeStr;
}
public static String getCron ( Date date, String dateFormat) {
return formatDateByPattern ( date, dateFormat) ;
}
public static String getCron ( LocalDateTime date, String dateFormat) {
return formatDateByPattern ( date, dateFormat) ;
}
public static String getIntervalDayCron ( String param) {
return INTERVAL_DAY . replace ( "param" , param) ;
}
public static String getIntervalHourCron ( String param) {
return INTERVAL_HOUR . replace ( "param" , param) ;
}
public static String getIntervalMinuteCron ( String param) {
return INTERVAL_MINUTE . replace ( "param" , param) ;
}
public static void main ( String [ ] args) {
Date date = new Date ( ) ;
String cron = getCron ( date, YEAR ) ;
System . out. println ( "date-每年执行一次" + cron) ;
cron = getCron ( date, MONDAY ) ;
System . out. println ( "date-每周一执行" + cron) ;
cron = getCron ( date, EVERYDAY ) ;
System . out. println ( "date-每天执行" + cron) ;
System . out. println ( "------------------------------" ) ;
LocalDateTime localDateTime = LocalDateTime . now ( ) ;
cron = getCron ( localDateTime, YEAR ) ;
System . out. println ( "localDateTime-每年执行一次" + cron) ;
cron = getCron ( localDateTime, MONDAY ) ;
System . out. println ( "localDateTime-每周一执行" + cron) ;
cron = getCron ( localDateTime, EVERYDAY ) ;
System . out. println ( "localDateTime-每天执行" + cron) ;
LocalDate localDate = LocalDate . now ( ) ;
LocalDateTime dateTime = localDate. atTime ( 13 , 14 ) ;
cron = getCron ( dateTime, EVERYDAY ) ;
System . out. println ( "localDateTime-每天指定时间执行" + cron) ;
cron = getIntervalDayCron ( "1" ) ;
System . out. println ( "localDateTime-间隔1天执行" + cron) ;
cron = getIntervalHourCron ( "2" ) ;
System . out. println ( "localDateTime-间隔2小时执行" + cron) ;
cron = getIntervalMinuteCron ( "5" ) ;
System . out. println ( "localDateTime-间隔5分钟执行" + cron) ;
}
}