Java日期工具类-转换LocalDateTime为cron表达式

在日常开发过程中,可能涉及到定时任务相关的操作,这个时候可能会遇到将指定LocalDateTime时间转换成cron表达式的需求,这里写个工具类记录一下。

1、定时任务工具类

package cc.leeleo.douyin.util;
 
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
 
public class CronUtils {
    private static final DateTimeFormatter FORMAT = DateTimeFormatter.ofPattern("ss mm HH dd MM ? yyyy");
 
    public enum TimeCycle {
        YEAR, MONTH, WEEK, DAY, HOUR, MINUTE, SECOND
    }
 
    /**
     * 将LocalDateTime转换为cron表达式的字符串。
     *
     * @param dateTime 要转换的LocalDateTime
     * @return cron表达式
     */
    public static String toCronExpression(LocalDateTime dateTime) {
        return dateTime.format(FORMAT);
    }
 
    /**
     * 将指定的 LocalDateTime 对象转换为 指定周期的 cron 表达式字符串
     * @param dateTime LocalDateTime 对象
     * @param timeCycle 时间周期枚举值
     * @return cron 表达式字符串
     */
    public static String toCronExpression(LocalDateTime dateTime, TimeCycle timeCycle) {
        String cron = null;
        switch (timeCycle) {
            case YEAR:
                cron = String.format("%d %d %d %d %d ? *", dateTime.getSecond(),
                        dateTime.getMinute(), dateTime.getHour(), dateTime.getDayOfMonth(),
                        dateTime.getMonthValue());
                break;
            case MONTH:
                cron = String.format("%d %d %d %d * ? *", dateTime.getSecond(),
                        dateTime.getMinute(), dateTime.getHour(), dateTime.getDayOfMonth());
                break;
            case WEEK:
                cron = String.format("%d %d %d ? * %d *", dateTime.getSecond(),
                        dateTime.getMinute(), dateTime.getHour(), dateTime.getDayOfWeek().getValue() % 7);
                break;
            case DAY:
                cron = String.format("%d %d %d * * ? *", dateTime.getSecond(),
                        dateTime.getMinute(), dateTime.getHour());
                break;
            case HOUR:
                cron = String.format("%d %d * * * ? *", dateTime.getSecond(),
                        dateTime.getMinute());
                break;
            case MINUTE:
                cron = String.format("%d * * * * ? *", dateTime.getSecond());
 
            break;
            case SECOND:
                cron = "0/1 * * * * ? *";
                break;
            default:
                throw new IllegalArgumentException("Unknown time cycle: " + timeCycle);
        }
        return cron;
    }
 
    public static void main(String[] args) {
        //指定时间
        System.out.println(toCronExpression(LocalDateTime.now()));
        // 每年(这个月的这一天的这个时间执行一次)
        LocalDateTime dateTime = LocalDateTime.of(2023, 3, 30, 23, 45, 5);
        System.out.println(CronUtils.toCronExpression(dateTime, TimeCycle.YEAR));
        // 每月(这一天的这个时间执行一次)
        System.out.println(CronUtils.toCronExpression(dateTime, TimeCycle.MONTH));
        // 每周(这一天的这个时间执行一次)
        System.out.println(CronUtils.toCronExpression(dateTime, TimeCycle.WEEK));
        // 日(每天的23:53:00执行)
        System.out.println(CronUtils.toCronExpression(dateTime, TimeCycle.DAY));
        // 小时(每小时的53分执行)
        System.out.println(CronUtils.toCronExpression(dateTime, TimeCycle.HOUR));
        // 分钟(每分钟的53秒执行)
        System.out.println(CronUtils.toCronExpression(dateTime, TimeCycle.MINUTE));
        // 秒(每秒执行一次)
        System.out.println(CronUtils.toCronExpression(dateTime, TimeCycle.SECOND));
    }
}
 

2、测试结果

测试结果如下:

02 47 00 31 03 ? 2023
5 45 23 30 3 ? *
5 45 23 30 * ? *
5 45 23 ? * 4 *
5 45 23 * * ? *
5 45 * * * ? *
5 * * * * ? *
0/1 * * * * ? *
 
 

猜你喜欢

转载自blog.csdn.net/qq_30713721/article/details/134021074