每年每个季度的第一个星期五的下一个星期日的 Cron 作业

问题描述

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

然后我想在下周日运行 Cron 作业(想保留整个周六作为缓冲)。这种情况的克朗表达式是什么?

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

解决方法

我们需要解决的特殊情况:当星期日是该月的第 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,Sep 5,Dec 5,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 pm,这是 OP 所要求的。