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

时间:2021-01-24 20:41:35

标签: java spring-boot cron crontrigger

我正在使用 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 个答案:

答案 0 :(得分:1)

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