首页 > 解决方案 > 每年每个季度的第一个星期五的下星期日的 Cron 作业

问题描述

我正在使用java spring boot。我需要获取更新为“数据集每季度(3 月、6 月、9 月、12 月)更新的数据,通常在每月的第一个星期五

之后我想在下周日运行 Cron 工作(想保留一个整个周六作为缓冲区)。在这种情况下,Crone 表达式是什么?

cron 作业的参考。 https://docs.oracle.com/cd/E12058_01/doc/doc.1014/e12030/cron_expressions.htm

spring boot cron 作业的参考。 https://www.tutorialspoint.com/spring_boot/spring_boot_scheduling.htm

标签: javaspring-bootcroncrontrigger

解决方案


我们需要解决的特殊情况:当星期日是该月的第 1 天或第 2 天时。通过将星期日限制在 3-9 范围内的天数,我们是安全的。当星期日是第 3 天或更大时,我们可以确定当月有前一个星期五。

表达

0 0 16 3-9 3/3 SUN

表达式将触发

Sun, Mar 7, 2021 at 04:00:00 pm
Sun, Jun 6, 2021 at 04:00:00 pm
Sun, Sep 5, 2021 at 04:00:00 pm
Sun, Dec 5, 2021 at 04:00:00 pm
Sun, Mar 6, 2022 at 04:00:00 pm

表达式可以这样测试:

    var sundays = CronExpression.parse("0 0 16 3-9 3/3 SUN");
    var nextDate = LocalDateTime.now();
    var dateFormatter = DateTimeFormatter.ofPattern("EEE, MMM d, yyyy 'at' hh:mm:ss a");

    for (var i = 0; i < 5; i++) {
        nextDate = sundays.next(nextDate);
        System.out.println(nextDate.format(dateFormatter));
    }

我们可以通过查看 2024 年 6 月来验证特殊情况是否如所描述的那样工作

Sun, Jun 9, 2024 at 04:00:00 pm

来自 OP 的评论

我们可以在 2021 年 5 月验证这个案例。星期六是一个月的第一天。因此,我们需要 5 月 9 日星期日而不是 5 月 2 日星期日。即每月第一个星期五之后的星期日。

2021 年 5 月超出了所指定的季度计划,但我们可以通过将月份锁定到 5 月来测试这种情况,并保持表达式的其余部分不变,如下所示:

0 0 16 3-9 5 SUN

上面的测试代码将返回Sun, May 9, 2021 at 04:00:00 pmOP 所要求的。


推荐阅读