java - 每年每个季度的第一个星期五的下星期日的 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
解决方案
我们需要解决的特殊情况:当星期日是该月的第 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 所要求的。
推荐阅读
- json - 使用 ansible 解析 json 响应
- scrapy - 使用scrapy保留原始文本文件换行符
- python - 熊猫数据框中每一行的变量箱
- python - 在 PyQt5 中对齐弹出窗口小部件
- pascal - 我在 Pascal 中遇到偶数和奇数的一些问题
- javascript - 搜索 JavaScript 对象列表并确定它们是否包含相同值的最有效方法是什么?
- go - 为什么循环中赋值后的ID为0?
- python - TypeError:预期的字符串或类似字节的对象,适用于服务器但不适用于 PC
- javascript - Javascript 侦听器不会触发代理 getter
- azure-functions - 如何在 Azure 函数中使用多个可选参数