根据Cron表达式获取下一次执行时间

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");