生成某个时间范围定时执行的Cron表达式集合,任何时间跨度生成的集合最多包含5个cron表达式
有一个定时任务需要在 2023年1月20日至2023年7月1日的12:30:58时执行.
传统方式可能需要每天都创建一个定时任务。如果时间跨度很长任务就会特别多。单个cron表达式做不到这一点。
比如 cron:58 30 12 1-20 1-7 ? 2023
表示:在2023年至2023年的1月至7月的1日至20日的每天上午12点30分58秒触发任务。与我们的预期不符
public static void main(String[]args){
List<String> cronList = CronUtil.generateCronExpression("2023-05-14", "2025-08-14", "12:34:27");
// [27 34 12 14-31 5 ? 2023, 27 34 12 * 6-12 ? 2023, 27 34 12 * * ? 2024, 27 34 12 * 1-7 ? 2025, 27 34 12 1-14 8 ? 2025]
System.out.println(cronList);
}
时间范围 "2023-05-14"~"2025-08-14", 具体时间 12:34:27
|------------------------------------------------------------------------------------------------------------------------------------|
2023-05-14 2025-08-14
|---------------| |---------------| |---------------| |---------------| |---------------|
2023-05-14 2023-05-31 2023-06-01 2023-12-31 2024-01-01 2024-12-31 2025-01-01 2025-07-31 2025-08-01 2025-08-14
开始时间 结束时间 Cron表达式 含义
part1: 2023-05-14 2023-05-31 27 34 12 14-31 5 ? 2023 2023-05-14至2023-05-31的12:34:27时执行
part2: 2023-06-01 2023-12-31 27 34 12 * 6-12 ? 2023 2023-06至2023-12每一天的12:34:27时执行
part3: 2024-01-01 2024-12-31 27 34 12 * * ? 2024 2024年的每一天12:34:27时执行
part4: 2025-01-01 2025-07-31 27 34 12 * 1-7 ? 2025 2025-01至2025-07每一天的12:34:27时执行
part5: 2025-08-01 2025-08-14 27 34 12 1-14 8 ? 2025 2025-08-01至2025-08-14的12:34:27时执行
本质就是将上述时间拆分成5个连续的时间段,每一个时间段使用cron进行表示,任何一个时间范围都能拆分成上述5个部分。时间跨度小的情况下拆分的个数小于等于5
cron [27 34 12 14-31 5 ? 2023, 27 34 12 * 6-12 ? 2023, 27 34 12 * * ? 2024, 27 34 12 * 1-7 ? 2025, 27 34 12 1-14 8 ? 2025]
遍历整段时间范围[2023-05-14,2025-08-14]将每一天的执行时间与生成的cron表达式计算出的执行时间对比。
TestCronUtil