项目里面用到定时任务,免不了quartz表达式了解
其实quartz表达式了解,参考
关键是了解
second minute hours dayOfMonth month dayOfWeek year 每月 0 0 6 ? * 6#3 ? 每周 59 59 18 ? * 1 ? 自定义 28 47 9 30 7 ? 2006
表达式每个位置控制各自的数值,有可能有7位,也有可能有6位。
下面是每一个位可用数值
Field Name Mandatory? Allowed Values Allowed Special Characters Seconds YES 0-59 , - * / Minutes YES 0-59 , - * / Hours YES 0-23 , - * / Day of month YES 1-31 , - * ? / L W C Month YES 1-12 or JAN-DEC , - * / Day of week YES 1-7 or SUN-SAT , - * ? / L C # Year NO empty, 1970-2099 , - * /看了一下表达式写个简单的js构建quartz cron表达式js ,勉强满足需求,
var quartzUtil = (function() { return { /** * 数据获取,从data获取到key的值,没有就返回默认值 */ getValue : function(data, key, def) { if (typeof(data[key]) == 'undefined') { return def; } else { if (data[key]) { return data[key]; } else { return def; } } }, /** * 表达式转换 * data定义 * * * */ parse : function(data) { var parseArray = []; var rate = data["rate"]; switch (rate) { //每年 case "year" : //0 0 0 10 12 ? * var hour = quartzUtil.getValue(data, "hour", "0"); var min = quartzUtil.getValue(data, "min", "0"); var second = quartzUtil.getValue(data, "second", "0"); var day=quartzUtil.getValue(data, "day", "0"); var month=quartzUtil.getValue(data, "month", "0"); var rtn = [second, min,hour , day, month,"*","?"]; return rtn.join(" "); break; //每月 case "month" : //"0 15 10 15 * ?" var hour = quartzUtil.getValue(data, "hour", "0"); var min = quartzUtil.getValue(data, "min", "0"); var second = quartzUtil.getValue(data, "second", "0"); var day=quartzUtil.getValue(data, "day", "1"); var rtn = [second, min,hour , day, "*", "?"]; return rtn.join(" "); break; //每星期 case "week" : var hour = quartzUtil.getValue(data, "hour", "0"); var min = quartzUtil.getValue(data, "min", "0"); var second = quartzUtil.getValue(data, "second", "0"); var week = quartzUtil.getValue(data, "week", "error"); if(week=="error"){ alert("error"); return ; } var rtn = [second, min,hour , "?", "*", week]; return rtn.join(" "); //0 0 12 ? * WED break; //每天 case "day" : var hour = quartzUtil.getValue(data, "hour", "0"); var min = quartzUtil.getValue(data, "min", "0"); var second = quartzUtil.getValue(data, "second", "0"); var rtn = [second, min,hour , "*", "*", "?"]; return rtn.join(" "); break; //每小时 case "hour" : //59 30 * * * ? var min = quartzUtil.getValue(data, "min", "0"); var second = quartzUtil.getValue(data, "second", "0"); var rtn = [second, min,"*" , "*", "*", "?"]; return rtn.join(" "); break; //每分钟 case "min" : var second = quartzUtil.getValue(data, "second", "0"); var rtn = [second, "*","*" , "*", "*", "?"]; return rtn.join(" "); break; default : break; } } }})();整个例子上传到
后台spring 解析,根据表达式计算下次运行的时间
/** * 根据 spring cron express 表达式,输入时间获取下次时间 * @description TODO * @param express 表达式 * @param date 时间 * @return 下次时间 */ public static Date getNextDate(String express, Date date) { Assert.notNull(express, "express is null"); Assert.notNull(date, "date is null"); // SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); CronSequenceGenerator cg = new CronSequenceGenerator(/*"0 0 0 1 1/6 *"*/express, TimeZone.getDefault()); return cg.next(date); } public static void main(String[] args) { System.out.println(Utils.getNextDate("0 0 0 1 1/6 *", null)); System.out.println(Utils.getNextDate("0 0 0 1 1/6 *",Utils.getNextDate("0 0 0 1 1/6 *", new Date()))); }