在日常开发过程中,可能涉及到定时任务相关的操作,这个时候可能会遇到将指定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 * * * * ? *