Cron syntax looks like line noise until you learn the five fields. Once it clicks, you can read (and write) any schedule at a glance — and stop accidentally running a job every minute.
The five fields
A cron expression is five space-separated fields, always in this order: minute, hour, day-of-month, month, day-of-week. Each field can be a specific number, a range, a list, a step, or an asterisk meaning "every".
| Field | Values |
|---|---|
| Minute | 0–59 |
| Hour | 0–23 |
| Day of month | 1–31 |
| Month | 1–12 |
| Day of week | 0–6 (Sun–Sat) |
Pick your schedule visually and get the exact expression plus a plain-English explanation.
Open Cron Expression GeneratorReading common examples
* * * * *— every single minute (rare in production, mostly for testing).0 * * * *— the top of every hour.0 0 * * *— once a day, at midnight.0 9 * * 1-5— 9am, Monday through Friday only.0 0 1 * *— midnight on the first of every month.
The mistake almost everyone makes once
Leaving the minute field as * when you meant a specific time. * 9 * * * doesn't mean "9am" — it means "every minute during the 9am hour," so your job fires 60 times. Always set an explicit minute (0 9 * * *) for anything that should run once.
Day-of-month and day-of-week interact oddly
If you fill in both day-of-month and day-of-week (not *), most cron implementations treat it as OR, not AND — the job runs if either condition matches. This trips people up when they expect "the 1st, but only if it's a Monday." Leave one of the two fields as * to avoid the ambiguity.
Testing before you deploy
The safest habit is to generate the expression, then read back its plain-English meaning before you commit it to a crontab or a CI pipeline. A schedule that's wrong by one field can mean a backup job that never runs, or a report that spams every minute. Our generator does that translation for you and runs entirely in your browser.