Cron Special Characters

Cron special characters are the symbols you can use inside a field: * for every value, a comma for a list, a hyphen for a range, a slash for a step, and on some platforms ?, L, W and #.

Last updated: October 8, 2026

The short answer

Four cron special characters work everywhere: * every value, , a list, - a range and / a step. The characters ?, L, W and # exist only on some platforms, mainly AWS EventBridge and Quartz.

*/15 9-17 * * 1-5

Runs every 15 minutes between 9:00 AM and 5:59 PM every weekday (Mon-Fri).

Try a special character

Pick an example or type your own. Choose the matching syntax so platform-only symbols are accepted.

The cron wildcard: the asterisk

The asterisk stands for "every value this field allows". It does not mean "every minute" unless it is in the minute field. In the hour field it means every hour, in the month field every month.

That is why 0 9 * * * runs once, at 9:00, while * 9 * * * runs every minute from 9:00 to 9:59. The first line pins the minute to 0; the second leaves it open. EventBridge adds one rule: you cannot use * in both day fields, so one of them must be ?.

Lists and ranges

A comma separates values, and a hyphen gives an inclusive range. You can mix them: 0 9-12,15-17 * * * means minute 0 of the hours 9 to 12 and 15 to 17. Ranges that wrap past the end of a field, such as 22-2 for hours, are not valid on every system, so write two ranges (22-23,0-2) when you need one.

The cron slash operator: steps

A slash sets a step. */15 in the minute field means every 15th value starting from the first one the field allows, and 10-40/10 steps only through the range 10 to 40. The step counts from the start of its range, not from the moment you deploy.

StepValues it matches in the minute fieldNote
*/150, 15, 30, 45Even split of the hour.
10-40/1010, 20, 30, 40The step runs through the range only.
*/70, 7, 14, 21, 28, 35, 42, 49, 56Then back to 0, so the last gap is 4 minutes.
5/155, 20, 35, 50Start and step. Accepted by GitHub Actions, EventBridge and Quartz; not portable to every Linux cron.

Two consequences matter in practice. A step that does not divide the field evenly, such as */7, restarts at the top of every hour, so one gap is shorter. A step as large as the whole range, such as */45 in the hour field, matches only the first value. For an exact interval that does not divide 60, use a different approach: a longer interval, or a job that checks the elapsed time.

The cron every 5 minutes page uses the slash for every interval it covers.

The question mark

The question mark means "no specific value". AWS EventBridge and Quartz require it in exactly one of the two day fields, because they do not allow both to be restricted or both to be *. Spring accepts it as an alternative to *, and Kubernetes treats it as *. Linux, GitHub Actions and Vercel reject it.

In practice: write 0 0 9 ? * MON-FRI on Quartz, and 0 9 * * 1-5 on Linux. The same schedule, two spellings.

L, W and #: calendar shortcuts

These three express things standard cron cannot: "the last day", "the nearest weekday", and "the second Friday". They exist in AWS EventBridge, Quartz and Spring. Quartz and EventBridge number the weekdays 1 to 7 starting with Sunday, so use names such as FRI to avoid mistakes.

ExpressionWhat it doesUse
0 0 0 L * ?Runs at 12:00 AM on the last day of every month.
Quartz and EventBridge: last day of the month.
Open
0 0 0 LW * ?Runs at 12:00 AM on the last weekday of every month.
The last weekday of the month.
Open
0 0 0 15W * ?Runs at 12:00 AM on the weekday nearest day 15 of every month.
The weekday nearest the 15th. It never crosses into another month.
Open
0 0 12 ? * FRI#2Runs at 12:00 PM on the second Friday of every month.
The second Friday of the month.
Open
0 0 12 ? * FRILRuns at 12:00 PM on the last Friday of every month.
The last Friday of the month. Quartz and EventBridge number Friday as 6.
Open

Limits to remember: W only works with a single day, not a list or range; # allows only one expression in the day-of-week field; and in Quartz, L should not be combined with lists or ranges. Spring numbers weekdays differently (Sunday is 0 or 7), so names are the safe choice there too. On Linux, the usual workaround for the last day of the month is covered on the first and last day of month page.

Cron special characters by platform

Support as implemented in CronWave's engine from each platform's documentation. Spring follows the Quartz column for ?, L, W and #, with different weekday numbers.

CharacterLinuxKubernetesGitHub ActionsVercelAWSQuartz
* , - /YesYesYesYesYesYes
?NoTreated as *NoNoYesYes
L (last day of month)NoNoNoNoYesYes
W (nearest weekday)NoNoNoNoYesYes
# (nth weekday)NoNoNoNoYesYes

Common mistakes with special characters

  • Pasting a Quartz expression into Linux. The ? and a leading seconds field both fail. Use the cron expression validator to see exactly which part is rejected.
  • Expecting L in GitHub Actions. It is not supported there, or in Vercel and standard Linux cron.
  • Combining # in a list. EventBridge documents that 3#1,6#3 is invalid.
  • Reading 5/15 as "every 15 minutes". It starts at 5, so the runs are at 5, 20, 35 and 50.

Sources and further reading