gpt4 book ai didi

java - 为每个月的第一个工作日和第15个工作日上午 8 点创建一个 cron 表达式

转载 作者:行者123 更新时间:2023-12-02 02:18:19 31 4
gpt4 key购买 nike

我必须创建每个月运行两天的批处理作业。例如,它将在该月的第一个工作日第一次运行,然后应该在第一个工作日之后的第 14 个工作日运行,即 (1+14=15) 在同月的第 15 个工作日运行。这两天不应是周六和周日,仅应考虑工作日。

我知道第一个工作日 -> ( 0 0 8 1W * ?) 和第 15 个工作日 -> ( 0 0 8 15W * ?) 的 2 个单独的 cron 表达式。所以,我已经尝试过( 0 0 8 1W,15W * ?),但它不允许我在单个 cron 中拥有工作日列表。

我还没有参与编码部分,因为我首先需要的是 cron 表达式来在一个月的 2 个工作日运行我的内务任务。

0 0 8 1W,15W * ?使用这个 cron 表达式,我期望结果为 2019 年 7 月 1 日星期一和 2019 年 7 月 15 日星期一,但实际结果仅为 2019 年 7 月 1 日星期一。

最佳答案

当月份中的某一天具有工作日标志时,Quartz CronExpression 类在处理下一次触发时间时似乎存在错误。

也就是说,W 似乎并不像您上面描述的那样工作,因为它找到最近的工作日,而不是下一个工作日。因此,如果 15 日是星期六,则作业将在前一个星期五运行。

理论上,您可以通过编写自己的触发器或日历实现来解决此问题。或者,您可以每天早上 8 点触发作业,如果运行日期无效,则提前终止。例如,在工作的第一行,您可以有这样的行:

   if (!shouldRunToday()) {
return;
};

使用 JodaTime 的 shouldRunToday 实现可能如下所示:

    public static boolean shouldRunToday() {
LocalDate date = LocalDate.now();

Set<Integer> days = new HashSet<>();
days.add(1);
days.add(15);

DayOfWeek dayOfWeek = DayOfWeek.of(date.getDayOfWeek());
if (dayOfWeek == DayOfWeek.MONDAY) {
days.add(2);
days.add(3);
days.add(16);
days.add(17);
}

Set<DayOfWeek> weekend = EnumSet.of(DayOfWeek.SATURDAY, DayOfWeek.SUNDAY);
return days.contains(date.getDayOfMonth()) && !weekend.contains(dayOfWeek);
}

如果您想使用日历,等效代码如下所示

    public static boolean shouldRunToday() {
Calendar date = Calendar.getInstance();

Set<Integer> days = new HashSet<>();
days.add(1);
days.add(15);

int dayOfWeek = date.get(Calendar.DAY_OF_WEEK);
if (dayOfWeek == Calendar.MONDAY) {
days.add(2);
days.add(3);
days.add(16);
days.add(17);
}

List<Integer> weekend = Arrays.asList(Calendar.SATURDAY, Calendar.SUNDAY);
return days.contains(date.get(Calendar.DAY_OF_MONTH)) && !weekend.contains(dayOfWeek);
}

关于java - 为每个月的第一个工作日和第15个工作日上午 8 点创建一个 cron 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57288619/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com