Cron Expression Builder
Build a cron expression just by picking minute, hour, day, month and weekday from dropdowns and number inputs. Preview the generated cron string, a plain-English description, and the next 5 run times instantly — handy for writing a crontab or GitHub Actions schedule.
Quick reference for common schedules
A list of cron expressions for typical schedules. Click a row to apply it as a preset in the builder above.
| Preset | Cron expression | Meaning |
|---|---|---|
| Daily at midnight | 0 0 * * * | Runs daily at midnight (00:00). |
| Weekdays at 9 AM | 0 9 * * 1-5 | Runs at 9:00 on weekdays (Monday through Friday). |
| Hourly at minute 0 | 0 * * * * | Runs once an hour, at minute 0. |
| Every Monday | 0 0 * * 1 | Runs every Monday at midnight (00:00). |
What a cron expression is
A cron expression is the five numeric fields that tell a UNIX job scheduler when to run something. From left to right they are minute, hour, day of month, month and day of week, separated by spaces, as in `30 3 * * 1` — every Monday at 3:30 in the morning. The notation is compact, but that is also its weakness: a mistyped field is usually still syntactically valid, so the job quietly runs at the wrong time and nobody notices until much later.
This builder lets you set each of the five fields using one of five modes — every value, a single value, a list, a range or a step — and shows the resulting expression alongside a plain-language reading of it. Because you can go from inputs to expression and from expression back to a sentence on the same screen, you can check that what you wrote is what you meant before it ever reaches a server. Everything runs in your browser; nothing you type is sent anywhere.
Building a cron expression
- Start from a preset Pick the closest of the four presets — midnight daily, 9 a.m. on weekdays, hourly on the hour, or weekly on Monday — and every field is filled in for you. It is faster than starting from scratch and leaves less room for slips.
- Choose a mode for each field For minute, hour, day, month and day of week, pick every value (*), a single value, a list, a range or a step (*/n). Leave the fields you do not care about on "every value".
- Enter the values A list takes comma-separated numbers, a range takes a start and an end, and a step takes the interval. Minutes run 0–59, hours 0–23, days 1–31, months 1–12 and weekdays 0–6 with 0 meaning Sunday.
- Check the expression against the description Read the generated expression and the sentence beneath it side by side. If the sentence does not match your intent, adjust the field that is wrong.
- Paste it into your crontab Once it reads correctly, copy the expression, open your table with `crontab -e`, put it at the start of a line and write the command you want to run after it.
Tips for getting more out of it
- Setting the day-of-week field to "Range" mode from 1 to 5 gives you Monday through Friday in one step.
- "List" mode lets you enter several values separated by commas — e.g. entering "0,15,30,45" for the minute field is equivalent to running every 15 minutes.
- If both the day-of-month and day-of-week fields are set to anything other than "Every (*)", standard cron treats them as an OR condition — the job runs when either one matches.
- The generated cron string can be copied to your clipboard with the "Copy" button, ready to paste straight into a crontab or a GitHub Actions YAML file.
- Click a preset button, or a row in the quick reference table below, to apply a common schedule to the builder in one click.
Where this tool helps
Scheduling backups and batch jobs
Database dumps and log rollups usually belong in the quiet hours. You can assemble something like "3:05 every morning" without having to recall the syntax first.
Running on business days only
Setting the day-of-week field to the range 1–5 restricts a job to weekdays. Cron knows nothing about public holidays, so if you need those excluded, put the check inside your script.
Decoding an expression somebody else wrote
When you inherit a server whose crontab contains `*/15 2-5 * * *`, reproducing the same settings here and reading the description keeps you from guessing wrong.
Setting schedules for CI and containers
GitHub Actions `schedule` entries and Kubernetes CronJobs use the same five fields. They normally run in UTC, though, so remember to shift the hour field by your offset.
Cron terms explained
- cron
- The long-running program on UNIX-like systems that executes commands at specified times. Its configuration lives in a per-user table called a crontab.
- crontab
- Both the schedule table itself and the command used to edit it (`crontab -e`). Each line pairs a cron expression with the command to run.
- Asterisk (*)
- Means "every value" for that field. An asterisk in the minute field means every minute; in the month field it means every month.
- Step (*/n)
- Runs on every nth value. `*/15` in the minute field means minutes 0, 15, 30 and 45. The count always starts from the lowest value of the field — it does not mean "n minutes after the last run".
- Lists and ranges
- A list is comma-separated (`1,15`); a range is joined with a hyphen (`9-17`). The two can be combined in one field, as in `1-5,10`.
- Day of month with day of week
- In most cron implementations, restricting both the day-of-month and the day-of-week field means the job runs when **either** matches, not both. `0 0 1 * 1` therefore means "the 1st of every month, and also every Monday" — a combination that surprises people regularly.
Frequently Asked Questions
Side Note — Why Writing a Cron Expression Is Harder Than Reading One
A cron expression looks simple once you know its 5 fields, but writing one by hand means recalling details like whether "*/15" or "1-30/5" is the right form, or whether weekdays start at 0 or 1 — details that are surprisingly easy to get wrong. Reading an existing cron expression (the job of this site's Cron Expression Parser) is comparatively mechanical, since you just walk through the fields one by one.
This tool is built around that asymmetry: it supports the act of building a cron expression from UI selections rather than typing raw syntax. You express your intent directly — "run at 9 AM on weekdays" — through dropdowns and number inputs, and the tool assembles a cron expression that satisfies it, removing the need to memorize the syntax altogether.
As a final sanity check, the tool previews the next 5 scheduled run times for the expression you just built. This matters especially because of a subtle rule that trips people up: when both the day-of-month and day-of-week fields are restricted, cron treats them as an OR condition rather than an AND. Seeing the actual candidate dates helps catch a job that would otherwise run more often than intended.