Quartz调度框架里最大的亮点就是Cron表达式,他能灵活的表达任务计划周期,但由于它的语法复杂多变,要让用户去书写Cron表达式,则简直就好比要小姐从良是一样的难。所以才有了Cron表达式工具类,使用它可以通过接收一些必要参数自动输出一个标准的Cron表达式。废话不多说,亮剑看码:
package com.yida.framework.base.util.quartz; import java.util.Date; import com.yida.framework.base.util.DateUtil; import com.yida.framework.modules.po.TaskSchedule; import com.yida.framework.modules.web.model.TaskScheduleModel; /** * @ClassName: CronUtil * @Description: Cron表达式工具类 * @author Lanxiaowei(736031305@qq.com) * @date 2015年12月11日 上午10:12:18 * */ public class CronUtil { /** * *方法摘要:构建TaskSchedule实例 *@param taskScheduleModel *@return TaskSchedule */ /** * 所选作业类型: * 1 -> 简单任务[一次或多次] * 2 -> 每天 * 4 -> 每周 * 8 -> 每月 * 16 -> 每时间段 * 32 -> 系统启动时 */ public static TaskSchedule createTaskSchedule(TaskSchedule taskSchedule,TaskScheduleModel taskScheduleModel){ if(null == taskSchedule){ taskSchedule = new TaskSchedule(); } taskSchedule.setScheduleName(taskScheduleModel.getScheduleName()); //计划执行开始时间 Date startTime = taskScheduleModel.getScheduleStartTime(); if(null != startTime){ taskSchedule.setScheduleStartTime(startTime); } //计划状态[默认:未运行] taskSchedule.setScheduleStatus(taskScheduleModel.getScheduleStatus()); //计划详细描述 String description = createDescription(taskScheduleModel); taskSchedule.setScheduleDescription(description); //简单任务 if(taskScheduleModel.getJobType().intValue() == 1){ //计划类型 taskSchedule.setScheduleType(TaskSchedule.SCHEDULE_TYPE_SIMPLE); //计划延迟 taskSchedule.setScheduleInterval(taskScheduleModel.getScheduleInterval()); //计划重复执行次数 taskSchedule.setScheduleRepeatCount(taskScheduleModel.getScheduleRepeatCount()); taskSchedule.setScheduleStartTime(taskScheduleModel.getScheduleStartTime()); taskSchedule.setScheduleEndTime(taskScheduleModel.getScheduleEndTime()); } //系统启动时 else if(taskScheduleModel.getJobType().intValue() == 64){ //计划类型 taskSchedule.setScheduleType(TaskSchedule.SCHEDULE_TYPE_WEB_STARTUP); } else { //Cron表达式 String cron = createCronExpression(taskScheduleModel); taskSchedule.setScheduleCron(cron); //计划类型 taskSchedule.setScheduleType(TaskSchedule.SCHEDULE_TYPE_CRON); } return taskSchedule; } /** * *方法摘要:构建Cron表达式 *@param taskScheduleModel *@return String */ public static String createCronExpression(TaskScheduleModel taskScheduleModel){ StringBuffer cronExp = new StringBuffer(""); //计划执行开始时间 Date startTime = taskScheduleModel.getScheduleStartTime(); if(null != startTime){ //秒 cronExp.append(DateUtil.getSecond(startTime)).append(" "); //分 cronExp.append(DateUtil.getMinute(startTime)).append(" "); //小时 cronExp.append(DateUtil.getHourOfDay(startTime)).append(" "); //按每天 if(taskScheduleModel.getJobType().intValue() == 2){ //每工作日 if(taskScheduleModel.getEveryWeekDay().charValue() == '1'){ //一个月中第几天 cronExp.append("? "); //月份 cronExp.append("* "); //星期[星期一到星期五] cronExp.append("2-6"); } else{ //一个月中第几天 cronExp.append("*/").append(taskScheduleModel.getIntervalDay()).append(" "); //月份 cronExp.append("* "); //星期 cronExp.append("?"); } } //按每周 else if(taskScheduleModel.getJobType().intValue() == 4){ //一个月中第几天 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]); } } //每隔?周 if(taskScheduleModel.getIntervalWeek().intValue() > 0){ cronExp.append("/").append(taskScheduleModel.getIntervalWeek()); } } //按每月 else if(taskScheduleModel.getJobType().intValue() == 8){ //当前年份 int currentYear = DateUtil.getYear(startTime); //当前月份 int currentMonth = DateUtil.getMonth(startTime); //当前月份的最大天数 int maxDayOfMonth = DateUtil.getMaxDayOfMonth(currentYear, currentMonth); //月份中具体某一天 if (null != taskScheduleModel.getWhichDay()) { //如果所选日期数大于当月最大天数,则默认表示当月最后一天 if(taskScheduleModel.getWhichDay() > maxDayOfMonth){ cronExp.append("L "); } else{ cronExp.append(taskScheduleModel.getWhichDay()).append(" "); } } else{ cronExp.append("? "); } //指定多个月份 if(null != taskScheduleModel.getCountOfMonths()){ for(int i = 0; i < taskScheduleModel.getCountOfMonths().length; i++){ if(i == taskScheduleModel.getCountOfMonths().length - 1){ cronExp.append(taskScheduleModel.getCountOfMonths()[i]); } else{ cronExp.append(taskScheduleModel.getCountOfMonths()[i]).append(","); } } cronExp.append(" "); } else{ cronExp.append("? "); } //当月第几周的周几 if(null == taskScheduleModel.getIntervalDayOfWeek() || taskScheduleModel.getIntervalDayOfWeek() == 0){ cronExp.append("? "); } else if(taskScheduleModel.getIntervalDayOfWeek() > 4){ cronExp.append("L "); //超过4,表示当月最后一周 } else{ if(null == taskScheduleModel.getDayOfWeek()){ cronExp.append("*#").append(taskScheduleModel.getIntervalDayOfWeek()); } else{ cronExp.append(taskScheduleModel.getDayOfWeek()).append("#").append(taskScheduleModel.getIntervalDayOfWeek()); } } } //按间隔时间段 else if(taskScheduleModel.getJobType().intValue() == 16){ cronExp = new StringBuffer(""); //秒 if(null == taskScheduleModel.getIntervalCountOfSecond() || taskScheduleModel.getIntervalCountOfSecond().intValue() == 0){ cronExp.append(DateUtil.getSecond(startTime)).append(" "); } else{ cronExp.append(DateUtil.getSecond(startTime)).append("/"); cronExp.append(taskScheduleModel.getIntervalCountOfSecond()).append(" "); } //分 if(null == taskScheduleModel.getIntervalCountOfMinute() || taskScheduleModel.getIntervalCountOfMinute().intValue() == 0){ cronExp.append(DateUtil.getMinute(startTime)).append(" "); } else{ cronExp.append(DateUtil.getMinute(startTime)).append("/"); cronExp.append(taskScheduleModel.getIntervalCountOfMinute()).append(" "); } //小时 if(null == taskScheduleModel.getIntervalCountOfHours() || taskScheduleModel.getIntervalCountOfHours().intValue() == 0){ cronExp.append(DateUtil.getHourOfDay(startTime)).append(" "); } else{ cronExp.append(DateUtil.getHourOfDay(startTime)).append("/"); cronExp.append(taskScheduleModel.getIntervalCountOfHours()).append(" "); } //日期 if(null == taskScheduleModel.getIntervalCountOfDay() || taskScheduleModel.getIntervalCountOfDay().intValue() == 0){ cronExp.append(DateUtil.getDayOfMonth(startTime)).append(" "); } else{ cronExp.append(DateUtil.getDayOfMonth(startTime)).append("/"); cronExp.append(taskScheduleModel.getIntervalCountOfDay()).append(" "); } //月 if(null == taskScheduleModel.getIntervalCountOfMonth() || taskScheduleModel.getIntervalCountOfMonth().intValue() == 0){ cronExp.append(DateUtil.getMonth(startTime)).append(" "); } else{ cronExp.append(DateUtil.getMonth(startTime)).append("/"); cronExp.append(taskScheduleModel.getIntervalCountOfMonth()); } } // 按特定时间点 else if(taskScheduleModel.getJobType().intValue() == 32){ cronExp = new StringBuffer("* "); if(taskScheduleModel.getMinituesOfHour() != null && taskScheduleModel.getMinituesOfHour().length > 0) { int index = 0; for(int minitue : taskScheduleModel.getMinituesOfHour()) { if(index == taskScheduleModel.getMinituesOfHour().length - 1) { cronExp.append(minitue); } else { cronExp.append(minitue).append(","); } index++; } } if(taskScheduleModel.getHoursOfDay() != null && taskScheduleModel.getHoursOfDay().length > 0) { if(taskScheduleModel.getMinituesOfHour() != null && taskScheduleModel.getMinituesOfHour().length > 0) { cronExp.append(" "); } int index = 0; for(int hour : taskScheduleModel.getHoursOfDay()) { if(index == taskScheduleModel.getHoursOfDay().length - 1) { cronExp.append(hour); } else { cronExp.append(hour).append(","); } index++; } } cronExp.append(" * * *"); } } return cronExp.toString(); } /** * *方法摘要:生成计划的详细描述 *@param taskScheduleModel *@return String */ public static String createDescription(TaskScheduleModel taskScheduleModel){ StringBuffer description = new StringBuffer(""); //简单任务 if(taskScheduleModel.getJobType().intValue() == 1){ description.append("简单任务,延迟(ms):"); description.append(taskScheduleModel.getScheduleInterval()); if(taskScheduleModel.getScheduleRepeatCount() <= 0) { description.append(",执行次数:无限制,永远循环执行下去。"); } else { description.append(",重复执行次数:"); description.append(taskScheduleModel.getScheduleRepeatCount()); } } //系统启动时 else if(taskScheduleModel.getJobType().intValue() == 64){ description.append("系统启动时执行"); } else{ //计划执行开始时间 Date startTime = taskScheduleModel.getScheduleStartTime(); if(null != startTime){ //按每天 if(taskScheduleModel.getJobType().intValue() == 2){ //每工作日 if(taskScheduleModel.getEveryWeekDay().charValue() == '1'){ description.append("从").append(DateUtil.parseDate(startTime, "yyyy-MM-dd")); description.append("起,于每个工作日").append(DateUtil.parseDate(startTime, "HH:mm:ss")); description.append("执行"); } else{ //每天 if(taskScheduleModel.getIntervalDay().intValue() == 0){ description.append("从").append(DateUtil.parseDate(startTime, "yyyy-MM-dd")); description.append("起,于每天").append(DateUtil.parseDate(startTime, "HH:mm:ss")); description.append("执行"); } //每间隔?天 else{ description.append("从").append(DateUtil.parseDate(startTime, "yyyy-MM-dd")); description.append("起,每隔").append(taskScheduleModel.getIntervalDay()).append("天,于"); description.append(DateUtil.parseDate(startTime, "HH:mm:ss")); description.append("执行"); } } } //按每周 else if(taskScheduleModel.getJobType().intValue() == 4){ if(startTime != null) { description.append("从").append(DateUtil.parseDate(startTime, "yyyy-MM-dd")); description.append("起"); } //每隔?周 if(taskScheduleModel.getIntervalWeek().intValue() > 0){ description.append(",每隔").append(taskScheduleModel.getIntervalWeek()).append("周"); } if(taskScheduleModel.getDayOfWeeks() != null && taskScheduleModel.getDayOfWeeks().length > 0) { description.append(",于每周的").append(DateUtil.getWeekString(taskScheduleModel.getDayOfWeeks())).append(" "); } if(startTime != null) { description.append(" ,").append(DateUtil.parseDate(startTime, "HH:mm:ss")); } description.append("执行"); } //按每月 else if(taskScheduleModel.getJobType().intValue() == 8){ description.append("从").append(DateUtil.parseDate(startTime, "yyyy-MM-dd")); //选择月份 if(null != taskScheduleModel.getCountOfMonths() && taskScheduleModel.getCountOfMonths().length != 0){ description.append("起,于"); description.append(DateUtil.getMonthString(taskScheduleModel.getCountOfMonths())); } else{ description.append("起,于每月的"); if(null != taskScheduleModel.getWhichDay() && taskScheduleModel.getWhichDay().intValue() != 0){ //当前年份 int currentYear = DateUtil.getYear(startTime); //当前月份 int currentMonth = DateUtil.getMonth(startTime); //当前月份的最大天数 int maxDayOfMonth = DateUtil.getMaxDayOfMonth(currentYear, currentMonth); if(taskScheduleModel.getWhichDay() > maxDayOfMonth){ description.append("最后一天"); } else{ description.append(taskScheduleModel.getWhichDay()).append("号"); } } } //第几个星期 if(null != taskScheduleModel.getIntervalDayOfWeek() && taskScheduleModel.getIntervalDayOfWeek().intValue() != 0){ if(taskScheduleModel.getIntervalDayOfWeek() > 4){ description.append("最后一个星期"); } else{ description.append("第").append(taskScheduleModel.getIntervalDayOfWeek()); description.append("个星期"); } } //星期几 if(null != taskScheduleModel.getDayOfWeek() && taskScheduleModel.getDayOfWeek().intValue() != 0){ description.append("的").append(DateUtil.getWeekString(taskScheduleModel.getDayOfWeek())); } else{ description.append("的每天"); } description.append(DateUtil.parseDate(startTime, "HH:mm:ss")); description.append("执行"); } //按每间隔时间段 else if(taskScheduleModel.getJobType().intValue() == 16){ //没填写间隔信息 if((null == taskScheduleModel.getIntervalCountOfSecond() || taskScheduleModel.getIntervalCountOfSecond().intValue() == 0) && (null == taskScheduleModel.getIntervalCountOfMinute() || taskScheduleModel.getIntervalCountOfMinute().intValue() == 0) && (null == taskScheduleModel.getIntervalCountOfHours() || taskScheduleModel.getIntervalCountOfHours().intValue() == 0) && (null == taskScheduleModel.getIntervalCountOfDay() || taskScheduleModel.getIntervalCountOfDay().intValue() == 0) && (null == taskScheduleModel.getIntervalCountOfMonth() || taskScheduleModel.getIntervalCountOfMonth().intValue() == 0) ){ description.append("从").append(DateUtil.parseDate(startTime, "yyyy-MM-dd")); description.append("起,于"); description.append(DateUtil.parseDate(startTime, "HH:mm:ss")); description.append("执行一次"); } else{ //秒 if(null != taskScheduleModel.getIntervalCountOfSecond() && taskScheduleModel.getIntervalCountOfSecond().intValue() != 0){ description.append("从").append(DateUtil.parseDate(startTime, "yyyy-MM-dd")); description.append("起,每隔"); description.append(taskScheduleModel.getIntervalCountOfSecond()).append("秒,于"); description.append(DateUtil.parseDate(startTime, "HH:mm:ss")); description.append("执行"); } //分 if(null != taskScheduleModel.getIntervalCountOfMinute() && taskScheduleModel.getIntervalCountOfMinute().intValue() != 0){ description.append("从").append(DateUtil.parseDate(startTime, "yyyy-MM-dd")); description.append("起,每隔"); description.append(taskScheduleModel.getIntervalCountOfMinute()).append("分钟,于"); description.append(DateUtil.parseDate(startTime, "HH:mm:ss")); description.append("执行"); } //小时 if(null != taskScheduleModel.getIntervalCountOfHours() && taskScheduleModel.getIntervalCountOfHours().intValue() != 0){ description.append("从").append(DateUtil.parseDate(startTime, "yyyy-MM-dd")); description.append("起,每隔"); description.append(taskScheduleModel.getIntervalCountOfHours()).append("小时,于"); description.append(DateUtil.parseDate(startTime, "HH:mm:ss")); description.append("执行"); } //日 if(null != taskScheduleModel.getIntervalCountOfDay() && taskScheduleModel.getIntervalCountOfDay().intValue() != 0){ description.append("从").append(DateUtil.parseDate(startTime, "yyyy-MM-dd")); description.append("起,每隔"); description.append(taskScheduleModel.getIntervalCountOfDay()).append("天,于"); description.append(DateUtil.parseDate(startTime, "HH:mm:ss")); description.append("执行"); } //月 if(null != taskScheduleModel.getIntervalCountOfMonth() && taskScheduleModel.getIntervalCountOfMonth().intValue() != 0){ description.append("从").append(DateUtil.parseDate(startTime, "yyyy-MM-dd")); description.append("起,每隔"); description.append(taskScheduleModel.getIntervalCountOfMonth()).append("个月,于"); description.append(DateUtil.parseDate(startTime, "HH:mm:ss")); description.append("执行"); } } } //按特定时间点 else if(taskScheduleModel.getJobType().intValue() == 32){ if(startTime != null) { description.append("从").append(DateUtil.parseDate(startTime, "yyyy-MM-dd HH:mm:ss")); description.append("起开始执行"); } if(taskScheduleModel.getHoursOfDay() != null && taskScheduleModel.getHoursOfDay().length > 0) { int index = 0; description.append(",此后于每天的"); for(int hour : taskScheduleModel.getHoursOfDay()) { if(index == taskScheduleModel.getHoursOfDay().length - 1) { description.append(hour + 1).append("点"); } else { description.append(hour + 1).append("点,"); } index++; } } if(taskScheduleModel.getMinituesOfHour() != null && taskScheduleModel.getMinituesOfHour().length > 0) { int index = 0; description.append(","); for(int minitue : taskScheduleModel.getMinituesOfHour()) { if(index == taskScheduleModel.getMinituesOfHour().length - 1) { description.append(minitue + 1).append("分"); } else { description.append(minitue + 1).append("分,"); } index++; } } description.append("定时执行"); } } } return description.toString(); } }
相关推荐
1、Cron表达式解析(比如Quartz的Cron表达式),计算下一次触发时间; 2、经常使用的时间相关的操作工具类,比如时间格式化,字符串、Date、localDate、LocalDateTime类型间的转换等
Quartz是一个强大的作业调度框架,它支持cron表达式,允许你创建Job类并定义触发时间,然后将Job与Trigger(触发器)关联,Trigger可以是一个cron表达式。Spring框架中的`@Scheduled`注解则提供了声明式的方法来定时...
Java根据时间戳生成cron表达式,可传入时间范围灵活实现Cron基于日历形式的任务调度时间点,简单简洁,互用性强,可以灵活改动。
通过使用Java Swing创建一个Cron表达式解析器,你可以提供一个直观的工具,帮助开发者更好地理解和使用这种强大的时间调度机制。同时,这也是对Java编程、GUI设计和时间管理知识的一个综合实践。
在Java中,我们可能需要一个工具类来处理Cron表达式,例如将其转换为Java的`ScheduledFuture`对象,或者验证一个给定的字符串是否符合Cron表达式的格式。这个类可能会包含如`parseCronExpression`、`...
cron表达式是一种在Unix和其他类Unix系统中广泛使用的定时任务调度工具,用于配置计划任务的执行。这个压缩包“可直接使用-cron表达式前端生成工具.zip”提供了一个基于HTML、CSS和JavaScript实现的前端工具,它使得...
Cron表达式是一种在Unix和类Unix系统中用于配置计划任务的强大工具。它允许用户设置时间规则,以便在特定的时间间隔执行任务。在Java开发中,Cron表达式也经常被用于Spring框架的定时任务调度。这个"Cron表达式生成...
在Quartz中,我们可以使用`CronTrigger`类来创建基于cron表达式的触发器,并将其与作业(Job)关联,从而定义定时任务。`CronTrigger`的构造函数通常接受cron表达式字符串作为参数。 在实际应用中,理解并熟练掌握...
Cron表达式是Quartz中定义定时任务的关键组成部分,通过`CronTrigger`类,我们可以将Cron表达式与Job类关联,实现按预设时间执行的任务。 5. **在线生成软件**: 提供的压缩包可能包含一个在线Cron表达式生成器的...
在.NET开发环境中,C#是一种常用的编程语言,而Cron表达式则是一种强大的定时任务调度工具,常用于Linux系统中的计划任务。然而,在C#中,我们也可以通过库来解析和使用Cron表达式,这使得.NET开发者也能利用Cron的...
Cron表达式是一种在Unix和类Unix系统中广泛使用的任务调度工具,用于设置定时任务。它基于特定的时间格式,允许用户定义精确到秒的任务执行计划。Cron表达式的语法复杂,但功能强大,可以实现从每日一次到每分钟一次...
在IT领域,尤其是在Web开发中,`Cron表达式`是一种强大的工具,用于安排周期性的任务执行。在HTML和JSP(JavaServer Pages)这样的前端和后端技术中,使用Cron表达式可以帮助开发者实现定时任务,比如定时发送邮件、...
3. 验证生成的Cron表达式是否符合预期,可以使用Quartz提供的CronTrigger类进行测试和验证。 总之,这个超好用的Quartz Cron表达式HTML工具为Java开发者提供了一个强大的助手,使得管理Quartz定时任务变得更加直观...
cron表达式是一种在Unix和其他类Unix系统中广泛使用的任务调度工具,用于安排周期性任务的执行。这个前端生成工具是基于HTML、CSS和JavaScript实现的,使得非开发人员也能轻松创建和理解复杂的cron表达式,方便地...
这类工具通常会提供一个界面供用户输入时间参数,然后自动生成相应的cron表达式,降低了手动编写表达式的难度和出错概率。 此外,对于时间解析器,这是对cron表达式进行解析和验证的组件。在Java中,可以使用`org....
在这个"react+ts+antd cron表达式组件"项目中,开发者整合了这些技术来实现一个特定功能——Cron表达式编辑器。 Cron表达式是一种用于配置定时任务的格式,常见于Unix和Linux系统。它由七个字段组成,从左到右分别...
这可能是网上最完整的Cron表达式解析翻译方法。 Java版-解释翻译Cron表达式(代码奉上)。 此方法分为JavaScript版和Java版本,有需要的朋友请根据自己需要下载。 希望我写的方法有帮助到你,不足之处请多多指教。
`CronTrigger`类就是用来创建基于Cron表达式的触发器,你可以将生成的Cron表达式传递给`CronTrigger`的构造函数来创建触发器。 了解并使用Quartz Cron表达式生成器,可以帮助我们更高效地使用Quartz.NET进行定时...
3. **解析表达式**:生成器还可以将已有的cron表达式解析成人类可读的描述,帮助开发者理解表达式的具体含义。 4. **示例展示**:通常,生成器会提供一个日历视图或者时间轴,显示表达式对应的具体执行时间,以便...