cronsaidwhat.com Runs in your browser
Cron expression → plain English

Explain a cron expression in plain English

Paste an expression to read back exactly when it runs, plus the next few fire times.

Cron expression explainer

Five fields: minute, hour, day of month, month, day of week. Shorthands like @daily work too.

Try one

Enter a cron expression to explain it.

Next runs

Fields

    The field layout

    Five fields, always in this order:

    • minute — 0 to 59
    • hour — 0 to 23, on a 24-hour clock
    • day of month — 1 to 31
    • month — 1 to 12, or JAN through DEC
    • day of week — 0 to 7, or SUN through SAT. Both 0 and 7 are Sunday.

    Within any field:

    • * — every value
    • 5 — exactly that value
    • 1,15,30 — a list
    • 9-17 — a range, inclusive at both ends
    • */15 — a step, so every 15th value
    • 0-30/10 — a step within a range

    The mistake almost everyone makes

    When the day-of-month and day-of-week fields are both restricted, cron treats them as an or, not an and. The expression 0 0 13 * FRI does not mean "Friday the 13th" — it means the 13th of every month and every Friday, which is roughly 64 runs a year rather than one or two.

    There is no way to express "and" in standard cron. The usual workaround is to schedule the looser of the two and test the other inside the job, for instance by starting the script with a date check that exits early.

    Common questions

    What are the five fields?

    In order: minute (0–59), hour (0–23), day of month (1–31), month (1–12), and day of week (0–7, where both 0 and 7 mean Sunday). A sixth field at the front for seconds is a Quartz and Spring extension, not standard cron, and will be rejected by crontab.

    Why does my job run more often than I expected?

    Almost always the day-of-month and day-of-week rule. When both fields are restricted, cron fires when either one matches, not when both do. So '0 0 1 * MON' runs on the 1st of every month and on every Monday — not only on Mondays that happen to fall on the 1st. To require both, you have to test one of them inside the job itself.

    What does the slash mean?

    A step. '*/15' in the minute field means every 15th minute starting from 0, so 0, 15, 30, and 45. You can combine it with a range: '0-30/10' gives 0, 10, 20, and 30. A bare value with a step, like '5/20', starts at 5 and continues to the end of the range.

    What timezone do the next runs use?

    The next run times are calculated in UTC and also shown in your browser's timezone. Real cron daemons use the server's local timezone unless a CRON_TZ or TZ variable is set at the top of the crontab, which is a frequent source of jobs firing an hour out after a daylight saving change.

    What do @daily and the other shorthands mean?

    They are aliases for common schedules: @hourly is '0 * * * *', @daily and @midnight are '0 0 * * *', @weekly is '0 0 * * 0', @monthly is '0 0 1 * *', and @yearly and @annually are '0 0 1 1 *'. There is also @reboot, which runs once at startup and has no equivalent expression.