cron表达式格式:{秒数} {分钟} {小时} {日期} {月份} {星期} {年份(可为空)}
数值代表具体时间,*代表全匹配即每次,?只能日和星期位置上使用代表不确定,L用于日位置代表最后一天,W代表工作日,其余较为不常用。
例:(每年)每月每日0时0分0秒时执行: 0 0 0 * * ?
(每年)在6,12月的最后一日早8时0分0秒时执行:0 0 8 L 6,12 ?
测试网址:https://cron.qqe2.com/
而根据表达式获取下次的执行时间有两个工具类都可以使用:
org.quartz.CronTrigger; 和 org.quartz.CronExpression;
代码分别如下:
package com.example.demo.util;
import org.quartz.CronExpression;
import org.quartz.CronTrigger;
import java.text.ParseException;
import java.util.Date;
public class QuartzUtil {
public static void main(String[] args) {
//当前日期,也可修改来获取指定日期的下一次执行时间
Date date = new Date();
//Cron表达式,为每月最后一天执行
String cron = "0 0 0 L * ?";
try {
// 通过CronTrigger类计算下次执行日期
System.out.println("next: " + matchDate(date, cron));
// 通过CronExpression类计算下次执行日期
System.out.println("next: " + matchDate2(date, cron));
}
catch (ParseException e) {
e.printStackTrace();
}
}
private static Date matchDate(Date date, String cron) throws ParseException {
CronTrigger cronTrigger = new CronTrigger();
cronTrigger.setCronExpression(cron);
Date nextFireAt = cronTrigger.getFireTimeAfter(date);
return nextFireAt;
}
private static Date matchDate2(Date date, String cron) throws ParseException {
CronExpression cronExpression = new CronExpression(cron);
return cronExpression.getNextValidTimeAfter(date);
}
}
控制台输出(今天是2021-12-28):
next: Fri Dec 31 00:00:00 CST 2021
next: Fri Dec 31 00:00:00 CST 2021
附:String与Date格式相互转换
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Test {
public static void main(String[] args) throws ParseException {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date date = simpleDateFormat.parse("2021-12-29");
System.out.println(simpleDateFormat.format(date));
}
}