Skip to content

Cron Expression Explainer

Type a cron expression to see what it means in plain English, the next times it will run in your time zone or UTC, and what each field does. Works for crontab, GitHub Actions, Kubernetes CronJobs and Vercel Cron.
minutehourday (month)monthday (week)

“Every 15 minutes, from 09:00 to 17:59, on Monday through Friday.”

Next runs

  1. Calculating…

Field by field

*/15Minute0, 15, 30, 45
9-17Hour9, 10, 11, 12, 13, 14, 15, 16, 17
*Day of monthevery
*Monthevery
1-5Day of weekMon, Tue, Wed, Thu, Fri

Allowed: minute 0–59 · hour 0–23 · day of month 1–31 · month 1–12 or JAN–DEC · day of week 0–6 (0 = Sunday) or SUN–SAT

Cron syntax

A standard cron expression has five fields, separated by spaces:

FieldAllowed valuesSpecial characters
Minute0–59* , - /
Hour0–23* , - /
Day of month1–31* , - /
Month1–12 or JAN–DEC* , - /
Day of week0–6 (0 and 7 are Sunday) or SUN–SAT* , - /

* means every value, , lists values, - is a range and / a step. Shortcuts like @daily, @hourly, @weekly and @monthly work too.

Common cron expressions

ExpressionRuns
* * * * *Every minute
*/5 * * * *Every 5 minutes
*/15 * * * *Every 15 minutes
0 * * * *Every hour, on the hour
0 */6 * * *Every 6 hours
0 0 * * *Every day at midnight
30 9 * * *Every day at 09:30
0 9 * * 1-5Weekdays at 09:00
0 0 * * 0Every Sunday at midnight
0 0 1 * *First day of every month
0 0 1 1 *Once a year, on 1 January
0 9-17 * * 1-5Every hour from 09:00 to 17:00 on weekdays

Cron in GitHub Actions, Kubernetes and Vercel

  • GitHub Actions (on: schedule: - cron:) runs in UTC, and the shortest interval is every 5 minutes. Runs can be delayed at busy times.
  • Kubernetes CronJobs use the same 5 fields; set spec.timeZone (e.g. Africa/Lagos) to avoid UTC surprises.
  • Vercel Cron (in vercel.json) runs in UTC and calls one of your routes on schedule.
  • Quartz, Spring and node-cron use 6 or 7 fields (seconds first, optional year) and characters like ?, L and #. This explainer covers standard 5-field cron.

The day-of-month and day-of-week gotcha

If both day fields are restricted, standard cron runs when either matches. 0 0 1 * 1 runs on the 1st of every month and every Monday, not only on Mondays that fall on the 1st. The explainer shows exactly which days match.

Scheduling jobs that call APIs? Check an API's uptime and status before relying on it, and convert timestamps with the Unix timestamp converter.

Frequently asked questions

How do I run a cron job every 5 minutes?

Use */5 * * * *. The */5 in the minute field means every 5th minute (0, 5, 10… 55). For every 15 minutes use */15 * * * *, and for every 2 hours 0 */2 * * *.

What time zone does cron use?

Classic crontab uses the server's local time zone. GitHub Actions, Vercel Cron and most cloud schedulers use UTC; Kubernetes CronJobs use the controller's zone unless you set spec.timeZone. Tick UTC above to see run times the way those services will.

Why didn't my cron job run?

Common causes: the schedule is in UTC but you expected local time; both day-of-month and day-of-week are set (cron then runs when either matches); the job's environment is different (cron has a minimal PATH, so use absolute paths); or the expression has 6 fields when the scheduler expects 5.

What does */5 mean in cron?

The / sets a step: */5 means every 5 units across the field's whole range. 10-30/5 means every 5 units from 10 to 30. A comma makes a list (1,15) and a hyphen a range (1-5).

What's the difference between cron and crontab?

cron is the scheduler that runs in the background; a crontab (cron table) is the file listing the jobs and their schedules. You edit yours with crontab -e. The same 5-field expression format is used by GitHub Actions, Kubernetes, Vercel and many other tools.

More free developer tools