我正在使用 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
答案 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 所要求的。