Особые случаи, на которые нам нужно обратить внимание: Когда воскресенье — это день № 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