Задания Cron на следующее воскресенье первой пятницы каждого квартала года

Я использую весеннюю загрузку Java. Мне нужно получить данные, которые обновляются, поскольку наборы данных обновляются ежеквартально (март, июнь, сентябрь, декабрь), обычно в первую пятницу месяца

И я хочу запустить задание Cron в следующее воскресенье (хочу сохранить всю субботу в качестве буфера) после этого. Каким будет выражение Крона для этого условия?

Ссылка на задание cron. https://docs.oracle.com/cd/E12058_01/doc/doc.1014/e12030/cron_expressions.htm

Ссылка на задание cron для весенней загрузки. https://www.tutorialspoint.com/spring_boot/spring_boot_scheduling.htm


person Anonymous Creator    schedule 24.01.2021    source источник
comment
crontab.guru Помогает ли этот сайт?   -  person grian    schedule 24.01.2021
comment
Спасибо, очень хороший инструмент. Тем не менее, я не могу понять свою потребность. Я начал понимать, что этот случай может быть вообще невозможен, и мне просто нужно установить 9-й день месяца. Это 7 дней + 1 день буфера и проверка после этого буферного дня, который является 9-м днем.   -  person Anonymous Creator    schedule 25.01.2021


Ответы (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 года.

Sun, Jun 9, 2024 at 04:00:00 pm

Из комментария ОП

Мы можем проверить этот случай в мае 2021 г., где суббота — первый день месяца. Итак, вместо воскресенья 2 мая нам нужно воскресенье 9 мая. Что воскресенье после первой пятницы месяца.

Май 2021 года находится за пределами квартального графика, указанного в вопросе, но мы можем проверить этот случай, заблокировав месяц до мая и сохранив остальную часть выражения без изменений следующим образом:

0 0 16 3-9 5 SUN

Тестовый код выше вернет Sun, May 9, 2021 at 04:00:00 pm, что и запрашивает OP.

person Roar S.    schedule 24.01.2021
comment
Это не первая пятница и не первое воскресенье, а следующее воскресенье первой пятницы. - person Anonymous Creator; 25.01.2021
comment
Мы можем проверить этот случай в мае 2021 г., где суббота — первый день месяца. Итак, вместо воскресенья 2 мая нам нужно воскресенье 9 мая. Что воскресенье после первой пятницы месяца. - person Anonymous Creator; 25.01.2021
comment
@AnonymousCreator: Для проверки вашего случая из комментария с мая 2021 года: 0 0 16 3-9 5 SUN Если вы поместите это выражение в мой тестовый код, вы получите Sun, May 9, 2021 at 04:00:00 pm, что вы и просите. BR - person Roar S.; 25.01.2021
comment
Спасибо за это. Я еще не проверял. Но логика вроде бы должна работать. - person Anonymous Creator; 26.01.2021
comment
@AnonymousCreator: Пожалуйста. Я проверил это довольно тщательно, но если у вас возникнут какие-либо проблемы, пожалуйста, дайте мне знать. BR - person Roar S.; 26.01.2021