Cron expression generator

Paste a cron expression to see what it means in plain English and exactly when it runs next, in any time zone. Or pick a schedule below and get the expression to copy into crontab, a CI pipeline or a Kubernetes CronJob.

Common schedules

Make an expression

On

How to read a cron expression

A cron expression is five fields separated by spaces. The job runs at every minute where all five match (with one exception for the two day fields, below):

FieldAllowed valuesExample
Minute0-5930 = at half past
Hour0-239-17 = 9 am to 5 pm hours
Day of month1-311,15 = the 1st and 15th
Month1-12 or JAN-DEC*/3 = January, April, July, October
Day of week0-7 or SUN-SAT (0 and 7 are Sunday)1-5 = Monday to Friday
  • * means every value. , separates a list. - is a range, and ranges cannot wrap around (write 5-6,0 rather than 5-0).
  • /n is a step: */15 in the minute field is 0, 15, 30 and 45; 9-17/2 in the hour field is 9, 11, 13, 15 and 17. Steps count from the start of the range and restart each hour, day or month, so */7 minutes runs at :56 and then :00, only 4 minutes later.
  • Shortcuts: @hourly, @daily (also @midnight), @weekly (Sunday 00:00), @monthly and @yearly (also @annually). @reboot runs at start-up and has no schedule.
  • Six or seven fields, ?, L, W and # belong to Quartz, Spring or AWS EventBridge, not standard cron. The checker tells you which field to remove.

Worked example

*/15 9-17 * * 1-5 reads "every 15 minutes, between 09:00 and 17:59, Monday to Friday". Minute */15 gives 0, 15, 30, 45; hour 9-17 includes the whole 17:00 hour, so the last run of the day is 17:45, not 17:00. That is 4 runs an hour for 9 hours, 36 runs a day. Checked at 17:50 on Friday 23 October 2026, the next runs are Monday 26 October at 09:00, 09:15 and 09:30. To stop at 17:00 exactly, use two lines: */15 9-16 * * 1-5 and 0 17 * * 1-5.

The day-of-month and day-of-week trap

When both day fields are restricted, cron runs when either matches. 0 0 13 * 5 does not mean "Friday the 13th": it runs on the 13th of every month and on every Friday. If either field starts with *, both must match, which is why 0 0 */2 * 5 runs only on odd-numbered days that are Fridays. The explainer points this out whenever it applies. To run on the first Monday of the month, use 0 9 1-7 * * and check the weekday inside the command, for example [ "$(date +\%u)" = 1 ] && ./report.sh (in a crontab, % must be written as \%).

Time zones and daylight saving

Cron uses the clock of the machine or service that runs it. A server's crontab follows the server's time zone (often UTC on cloud servers). GitHub Actions schedules are always in UTC. Kubernetes CronJobs use the controller's time zone, usually UTC, unless you set spec.timeZone. Pick the zone above to see the runs as that machine will.

On the night the clocks change, some times do not exist and others happen twice. The run list follows cronie and Vixie cron, the cron on most Linux systems: a fixed-time job whose time is skipped runs right after the clocks jump forward, and one whose time repeats runs only once. Jobs with * in the minute or hour field just follow the clock. For example, 30 1 * * * in Europe/London runs at 02:00 BST on 29 March 2026, because 01:30 does not exist that night, and once at the first 01:30 on 25 October 2026. Other schedulers (systemd timers, cloud schedulers) can handle these nights differently, so avoid 01:00-03:00 for jobs that must run exactly once. To compare clock times between zones, use the time zone converter.

FAQ

How do I run a cron job every 5 minutes?

Use */5 * * * *. It runs at minutes 0, 5, 10 and so on, every hour of every day. Every 5 minutes during working hours on weekdays is */5 9-17 * * 1-5.

What does 0 0 * * 0 mean?

At 00:00 (midnight at the start of the day) every Sunday. It is the same as @weekly. Day 0 and day 7 both mean Sunday.

Why does my GitHub Actions schedule run at the wrong hour?

GitHub reads the cron in UTC. Choose "Use UTC" above, or convert: 09:00 in New York is 13:00 UTC in summer and 14:00 UTC in winter, so a single UTC expression shifts by an hour twice a year. GitHub can also start scheduled runs some minutes late when it is busy, and the shortest interval it allows is every 5 minutes.

Can cron run a job every 30 seconds?

Not by itself: the smallest unit is a minute. A common workaround is two lines, one running the command and one running sleep 30; command, both every minute. Quartz and Spring expressions have a seconds field, which is why they have 6 or 7 fields.

How do I run a job on the last day of the month?

Standard cron has no "last day" (L is a Quartz feature). Run it on days 28 to 31 and let the command check whether tomorrow is the 1st: 0 23 28-31 * * [ "$(date -d tomorrow +\%d)" = 01 ] && ./close-month.sh (GNU date).

Why does the explainer say my schedule never runs?

Some combinations cannot happen, such as day 30 in February (0 0 30 2 *) or day 31 in April, June, September or November. Cron accepts them without complaint and simply never runs the job.