How to build and read cron expressions
This cron expression generator lets you build a schedule field by field — with presets like "every 15 minutes", "weekdays" or "1st of the month", or any custom value — and see immediately what it means. It translates the expression into plain English, lists the next six times it will run in your local timezone, and draws a weekly heatmap so you can see at a glance when a job fires.
When the schedule looks right, copy a ready-made snippet for crontab, GitHub Actions, a Kubernetes CronJob or a systemd timer. Everything is calculated in your browser.
How to use the cron generator
- Click each of the five fields — minute, hour, day of month, month and day of week — and pick a preset, or type a custom value such as
*/10or9-17and press Enter. - To decode an existing expression such as
30 2 * * 1-5, enter each of its five parts into the matching field. - Read the plain-English description and check the next runs list. Make sure the times match what you expect in your timezone.
- Use the heatmap to spot problems such as a job that runs every minute of an hour instead of once.
- Copy the snippet for your platform: crontab, GitHub Actions, Kubernetes or systemd.
Cron format in one minute
* * * * *
│ │ │ │ └─ day of week 0–6 (0 = Sunday)
│ │ │ └──── month 1–12
│ │ └─────── day of month 1–31
│ └────────── hour 0–23
└───────────── minute 0–59| Syntax | Example | Meaning |
|---|---|---|
* | * * * * * | Every minute |
, | 0 9,13,17 * * * | At 09:00, 13:00 and 17:00 |
- | 0 9 * * 1-5 | 09:00 on weekdays |
/ | */15 * * * * | Every 15 minutes |
Need more examples? The cron syntax cheatsheet has 25 copy-ready schedules and the platform-specific gotchas.
Common cron mistakes
* 9 * * *is not "daily at 9". It runs every minute from 09:00 to 09:59 — 60 times. Use0 9 * * *. The heatmap makes this mistake obvious.- Day-of-month and day-of-week are combined with OR.
0 0 1 * 1runs on the 1st of every month and every Monday. The next-runs list here follows the same rule as crontab, so you can verify it. - Wrong timezone. System cron uses the server's timezone; GitHub Actions always uses UTC. A job meant for 9 am in Dhaka (UTC+6) should be
0 3 * * *in GitHub Actions. - Uneven steps.
*/7in the minute field fires at :56 and then again at :00 — steps restart every hour. Choose a step that divides 60 (or 24 for hours) evenly. - Six-field expressions. Quartz, Spring and AWS EventBridge add a seconds or year field and use
?. Standard crontab, GitHub Actions and Kubernetes only accept five fields.
Using the schedule on each platform
| Platform | Where it goes | Timezone | Note |
|---|---|---|---|
| crontab | crontab -e, one job per line | Server local time | Use absolute paths; escape % as \% |
| GitHub Actions | on.schedule[].cron in a workflow | UTC | Shortest interval is 5 minutes; runs may start late |
| Kubernetes | spec.schedule of a CronJob | Controller's zone unless spec.timeZone is set | Set concurrencyPolicy to avoid overlap |
| systemd | OnCalendar= in a .timer unit | System time (zone can be appended) | Different syntax; the snippet covers daily time-of-day schedules |
Frequently asked questions
What does * * * * * mean?
Five asterisks means "every minute of every hour of every day". Each * is a wildcard for one field: minute, hour, day of month, month, day of week.
How do I run a cron job every 5 minutes?
Use */5 * * * *. It fires at minutes 0, 5, 10 … 55 of every hour.
What timezone are the next run times shown in?
Your browser's local timezone. If your server or CI runs in UTC, convert accordingly — GitHub Actions schedules are always evaluated in UTC.
Does this support seconds or Quartz syntax?
No. It uses the standard five-field format supported by crontab, GitHub Actions and Kubernetes. Quartz-style expressions with a seconds field or ? are not supported.