Cron Expression Builder

Choose when a job should run and get the cron expression, its meaning in plain English, and the next five run times. Works in the other direction too.

Processed locally in your browser
Open in parser

Minute
Hour
Day of month
Month
Day of week
Presets
Next 5 runs (local time)
    ReadyStandard 5-field cron

    How the builder works

    Each of the five cron fields has its own control. Every writes *. Every N writes a step such as */15. From–to writes a range such as 9-17. Specific lets you tick individual values, which are written as a list (1,15) or collapsed into a range when they are consecutive (1-5). The expression at the top updates as you go, together with a plain-English reading and the next five run times.

    You can also type into the expression box directly. Edits there are evaluated immediately but do not rewrite the form, so an expression the form cannot represent (for example 8-18/2) is kept as you typed it.

    Reading the result

    */15 9-17 * * 1-5
    │    │    │ │ └── Monday to Friday
    │    │    │ └──── every month
    │    │    └────── every day of the month
    │    └─────────── 09:00 to 17:59
    └──────────────── every 15 minutes

    This runs at :00, :15, :30 and :45 of every hour from 9 to 17 on weekdays, so the last run of the day is 17:45.

    Schedules people build most often

    ScheduleExpression
    Every minute* * * * *
    Every 5 minutes*/5 * * * *
    Every hour, on the hour0 * * * *
    Every day at 02:3030 2 * * *
    Weekdays at 09:000 9 * * 1-5
    Twice a day, 06:00 and 18:000 6,18 * * *
    Every Sunday at midnight0 0 * * 0
    First day of every month0 0 1 * *
    Last day of the monthNot expressible in standard cron. Run daily and test [ "$(date -d tomorrow +\%d)" = 01 ] in the command.
    Every quarter (Jan, Apr, Jul, Oct 1st)0 0 1 1,4,7,10 *

    Things the five fields cannot say

    • Seconds. Standard cron's resolution is one minute. If you need sub-minute scheduling, loop inside the job or use a different scheduler.
    • Intervals that do not divide the field. */7 * * * * runs at 0, 7, 14 … 56 and then again at 0, not 63. Every 90 minutes needs two lines: 0 0-23/3 * * * and 30 1-23/3 * * *.
    • “Last Friday”, “second Tuesday”. Quartz has L and # for these; classic cron does not.
    • Day-of-month AND day-of-week. When both are set, cron matches either. See the parser page for the workaround.

    Installing the schedule

    # Open your crontab in an editor
    crontab -e
    # Add a line: schedule, then the command. Use absolute paths.
    */15 9-17 * * 1-5 /usr/local/bin/sync-reports >> /var/log/sync.log 2>&1

    Kubernetes CronJob, GitHub Actions on.schedule.cron and most cloud schedulers accept the same five-field string. GitHub Actions runs schedules in UTC; Kubernetes uses the controller's timezone unless timeZone is set.

    navigateEnter openEsc close