Все cron-выражения в Spring должны соответствовать одному и тому же формату, независимо от того, используете ли вы их в аннотациях @Scheduled, элементах task:scheduled-tasks или где-то еще. Правильно сформированное выражение в формате cron, такое как * * * * * *, состоит из шести полей времени и даты, разделенных пробелами, каждое из которых имеет свой диапазон допустимых значений:

 ┌───────────── секунда (0-59)
 │ ┌───────────── минута (0 - 59)
 │ │ ┌───────────── час (0 - 23)
 │ │ │ ┌───────────── день месяца (1 - 31)
 │ │ │ │ ┌───────────── месяц (1 - 12) (или JAN-DEC)
 │ │ │ │ │ ┌───────────── день недели (0 - 7)
 │ │ │ │ │ │          (0 или 7 – воскресенье, или MON-SUN)
 │ │ │ │ │ │
 * * * * * *

Существуют определенные правила:

  • Поле может быть звездочкой (*), которая всегда обозначает "первый-последний". Для полей "день месяца" или "день недели" вместо звездочки можно использовать знак вопроса (?).

  • Запятые (,) используются для разделения элементов списка.

  • Два числа, разделенные дефисом (-), выражают диапазон чисел. Заданный диапазон указывается включительно.

  • После диапазона (или *) с помощью / задается интервал значения числа через диапазон.

  • Для полей "день месяца" и "день недели" также можно использовать английские имена. Используйте первые три буквы конкретного дня или месяца (регистр не имеет значения).

  • Поля "день месяца" и "день недели" могут содержать символ L, который имеет иное значение

    • В поле "день месяца" L означает последний день месяца. Если за ним следует отрицательное смещение (т.е. L-n), это означает n-дней до последнего дня месяца.

    • В поле "день недели" L означает последний день недели. Если перед ним стоит цифра или трехбуквенное название (dL или DDDL), это означает последний день недели (d или DDD) в месяце.

  • Поле дня месяца может быть стоять nW, что означает ближайший будний день к n-дню месяца. Если n выпадает на субботу, это дает пятницу перед ней. Если n выпадает на воскресенье, это дает следующий за ним понедельник, что также происходит, если n равно 1 и выпадает на субботу (т.е: 1W означает первый будний день месяца).

  • Если в поле "день месяца" стоит LW, это означает последний будний день месяца.

  • Поле "день недели" может быть d#n (или DDD#n), что означает n-й день недели d (или DDD) в месяце.

Вот несколько примеров:

Выражения в формате Cron Значение

0 0 * * * *

каждый час каждого дня

*/10 * * * * *

каждые десять секунд

0 0 8-10 * * *

8, 9 и 10 часов каждого дня

0 0 6,19 * * *

6:00 утра и 7:00 вечера каждый день

0 0/30 8-10 * * *

8:00, 8:30, 9:00, 9:30, 10:00 и 10:30 каждый день

0 0 9-17 * * MON-FRI

по часам с девяти до пяти в будние дни

0 0 0 25 DEC ?

каждое Рождество в полночь

0 0 0 L * *

последний день месяца в полночь

0 0 0 L-3 * *

предпоследний день месяца в полночь

0 0 0 * * 5L

последняя пятница месяца в полночь

0 0 0 * * THUL

последний четверг месяца в полночь

0 0 0 1W * *

первый будний день месяца в полночь

0 0 0 LW * *

последний будний день месяца в полночь

0 0 0 ? * 5#2

во вторую пятницу месяца в полночь

0 0 0 ? * MON#1

в первый понедельник месяца в полночь

Макросы

Такие выражения, как 0 0 0 * * * * *, разбирать человеку тяжело и, следовательно, трудно исправлять в случае ошибок. Для улучшения читабельности Spring поддерживает следующие макросы, которые представляют часто используемые последовательности. Можно использовать эти макросы вместо шестизначного значения, таким образом: @Scheduled(cron = "@hourly").

Макрос Значение

@yearly (или @annually)

раз в год (0 0 0 1 1 *)

@monthly

раз в месяц (0 0 0 1 * *)

@weekly

раз в неделю (0 0 0 * * 0)

@daily (или @midnight)

один раз в день (0 0 0 * * *), или

@hourly

раз в час, (0 0 * * * *)