package cn.com.baidu.util;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
/**
* 将时间转为Cron表达式
* CBC
* 2023年10月23日15:37:14
*/
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 要转换的时间字符串
* @param format 要转换的时间格式
* @return cron表达式
*/
public static String toCronExpression(String dateTime, String format) {
LocalDateTime localDate = LocalDateTime.parse(dateTime, DateTimeFormatter.ofPattern(format));
String date = localDate.format(FORMAT);
return date;
}
/**
* 将LocalDateTime转换为cron表达式的字符串。
* @param dateTime 要转换的LocalDateTime
* @return cron表达式
*/
public static String toCronExpression(LocalDateTime dateTime) {
String date = dateTime.format(FORMAT);
return date;
}
/**
* 将指定的 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("2015年11月11日 10时15分16秒", "yyyy年MM月dd日 HH时mm分ss秒"));
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));
}
}
16 15 10 11 11 ? 2015
03 16 16 23 10 ? 2023
5 45 23 30 3 ? *
5 45 23 30 * ? *
5 45 23 ? * 4 *
5 45 23 * * ? *
5 45 * * * ? *
5 * * * * ? *
0/1 * * * * ? *