package shop.alien.util.cron;

import org.quartz.CronExpression;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author ssk
 * @version 1.0
 * @date 2025/2/17 9:40
 */
public class CronUtil {

    /**
     * cron表达式是一种用于指定定时任务的时间表达式，它由6或7个字段组成，每个字段代表一个时间单位。这些字段之间用空格分隔，从左到右依次为：秒（可选）、分、‌小时、‌日期、‌月份、‌星期、‌年份（可选）。
     * <p>
     * 在cron表达式中，可以使用一些特殊字符来增加灵活性：
     * <p>
     * ：代表所有可能的值。例如，在“小时”字段中使用表示“每个小时”。
     * ,：用于分隔列表中的值。例如，5,10,15在“小时”字段中表示5点、10点和15点。
     * -：用于指定范围。例如，1-5在“星期”字段中表示星期一到星期五。
     * /：用于指定步长。例如，在“分钟”字段中使用0/15表示从0分钟开始，每15分钟执行一次。
     * ?：在“日”和“星期”字段中，?表示不指定值，通常与另一个字段的特定值配合使用。
     * <p>
     * ‌示例cron表达式及其含义‌：
     * <p>
     * 0 0 * * * ?：每天午夜（00:00:00）执行一次任务。
     * 0 15 10 ? * *：每天上午10:15执行一次任务。注意这里使用了?来忽略“日”字段。
     * 0 0/30 * * * ?：每半小时执行一次任务。这里的/30表示从0分钟开始，每30分钟执行一次。
     * 0 0 9-17 * * MON-FRI：每个工作日（周一至周五）的上午9点到下午5点之间，每小时执行一次任务。
     * 0 0 0 25 12 ?：每年圣诞节（12月25日）午夜执行一次任务。这里使用了具体的日期和月份。
     */
    public static void main(String[] args) throws ParseException {
        String cronExpression = "0 0/5 14,18 * * ?";
        cronExpression = "0 0/5 14,18 * * ?";
        boolean isValid = CronExpression.isValidExpression(cronExpression);
        System.out.println("Is valid cron expression: " + isValid);

        CronExpression cron = new CronExpression(cronExpression);
        Date now = new Date();
        Date nextTime = cron.getNextValidTimeAfter(now);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("Next valid time: " + sdf.format(nextTime));


        Date prevTime = cron.getTimeAfter(now);
        System.out.println("Previous valid time: " + sdf.format(prevTime));
    }

}
