Cron Expression Generator
Build or paste a cron expression to see what it means in plain English and exactly when it will run next.
- Free
- No account
- Runs in your browser
- Nothing uploaded
At 09:00, on Monday, Tuesday, Wednesday, Thursday and Friday.
- Thu, Sep 17, 2026, 09:00
- Fri, Sep 18, 2026, 09:00
- Mon, Sep 21, 2026, 09:00
- Tue, Sep 22, 2026, 09:00
- Wed, Sep 23, 2026, 09:00
- Thu, Sep 24, 2026, 09:00
- Fri, Sep 25, 2026, 09:00
- Mon, Sep 28, 2026, 09:00
- Tue, Sep 29, 2026, 09:00
- Wed, Sep 30, 2026, 09:00
Runs entirely in your browser — your input is never uploaded, logged, or stored.Privacy policy
What is Cron Expression Generator?
A cron expression is five fields — minute, hour, day of month, month, day of week — that tell a scheduler when to run something. The syntax is compact and unforgiving, and the usual failure isn't a syntax error: it's an expression that parses cleanly and fires on a schedule you didn't intend.
This tool takes an expression and answers both questions that matter. What does it mean, in a sentence? And when does it actually fire — as real dates, in your timezone or in UTC, because a server running UTC and a person reading local time disagree by hours and that gap is where scheduling bugs live.
The case worth knowing about: when you narrow both the day-of-month and the day-of-week fields, cron treats them as OR, not AND. `0 0 1 * MON` does not mean "the first of the month, if it's a Monday" — it means "the first of the month, and also every Monday", which is roughly five times more often than intended. The tool says so in the description and shows you the dates, so the surprise happens here rather than in production.
Use it when writing a crontab, a Kubernetes CronJob, a GitHub Actions schedule, or any scheduler that takes standard five-field cron.
The expression is parsed field by field into the set of values each one matches, expanding `*`, ranges (`1-5`), steps (`*/15`, `0-30/10`), lists (`1,15,30`), and the month and day names (`JAN`, `MON`). The shorthands `@yearly`, `@annually`, `@monthly`, `@weekly`, `@daily`, `@midnight` and `@hourly` expand to their five-field equivalents before parsing.
Upcoming runs are found by walking forward from the current time and testing each candidate minute against those sets, skipping a whole day at a time when the day doesn't match. Day matching follows Vixie cron: if both the day-of-month and day-of-week fields are narrowed, a date matching either one is a match; if only one is narrowed, only that one is consulted. Times are computed directly in the timezone you select, so daylight-saving transitions are handled by the same rules your machine uses.
| Field | Range | Names accepted | Example | |
|---|---|---|---|---|
| Minute | 0-59 | — | */15 → 0, 15, 30, 45 | |
| Hour | 0-23 | — | 9-17 → 9am to 5pm | |
| Day of month | 1-31 | — | 1,15 → 1st and 15th | |
| Month | 1-12 | JAN-DEC | JAN → January only | |
| Day of week | 0-7 | SUN-SAT | 1-5 → weekdays |
Worked examples
- `*/15 * * * *` → "At minutes 0, 15, 30, 45 past every hour, every day." Next runs from midnight: 00:15, 00:30, 00:45, 01:00.
- `0 9 * * 1-5` → "At 09:00, on Monday, Tuesday, Wednesday, Thursday and Friday." From Sunday 1 March 2026, the next run is Monday 2 March at 09:00 — it correctly skips the weekend.
- `0 0 1 * MON` → "At 00:00, on day 1 of the month or on Monday." The OR rule in action: from 1 March 2026 the next runs are the 2nd, 9th, 16th and 23rd — every Monday, not only a Monday that lands on the 1st.
- `0 0 29 2 *` → "At 00:00, on day 29 of the month, in February." Only two runs come back within the 8-year horizon, 29 Feb 2028 and 29 Feb 2032, because that date does not exist in other years.
- `@daily` → "At 00:00, every day." Shorthands expand to their five-field form before anything else happens.
How to use Cron Expression Generator
- Type or paste a cron expression, or start from one of the presets.
- Read the plain-English description to check it says what you meant.
- Choose your timezone or UTC — schedulers usually run in UTC even when you don't.
- Check the upcoming run times. If the gaps between them aren't what you expected, the expression is wrong even though it parsed.
Common errors
- "A cron expression needs 5 fields (minute hour day-of-month month day-of-week) — this has 6." — you pasted a six-field expression. The extra leading field is seconds, which Quartz and Spring support but standard cron does not.
- "60 is out of range for the minute — it must be 0 to 59." — minutes and hours are zero-based, so the last minute of an hour is 59 and the last hour of a day is 23.
- "The minute range "5-1" runs backwards (5 is after 1)." — cron ranges don't wrap around. Write two items instead, like "1-59,0-5".
- "The step in "*/0" cannot be 0 — a step of 0 would never advance." — steps must be 1 or more; `*/1` is the same as `*`.
- ""FUNDAY" isn't a valid day of week." — day names are the three-letter forms SUN through SAT, and month names JAN through DEC.
- The expression parses but runs far more often than you expected — check whether you narrowed both day fields. Cron ORs them, so `0 0 1 * MON` fires on the 1st *and* every Monday.
- Runs appear at the wrong time of day — check the timezone selector. Most schedulers run in UTC regardless of where you or your server are.
FAQ
What do the five fields in a cron expression mean?
In order: minute (0-59), hour (0-23), day of month (1-31), month (1-12), and day of week (0-7, where both 0 and 7 mean Sunday). An asterisk in a field means every value of it.
Why does my cron job run more often than I expected?
Almost always because both the day-of-month and day-of-week fields are narrowed. Cron treats that as OR, not AND — `0 0 1 * MON` fires on the first of the month and on every Monday. To restrict to one specific weekday, leave day-of-month as `*`.
What timezone does cron use?
Whatever the machine running it is set to, which on servers and CI runners is usually UTC even when you are not. GitHub Actions schedules are always UTC. This tool lets you switch between UTC and your own timezone so you can see the difference before deploying.
How do I write a cron expression that runs every 15 minutes?
`*/15 * * * *`. The `*/15` is a step: start at the lowest value of the field and take every fifteenth from there, giving minutes 0, 15, 30 and 45 of every hour.
Does this support seconds, or the L and W operators?
No. This is standard five-field cron, as used by crontab, Kubernetes CronJobs and GitHub Actions. A seconds field and operators like `L` (last day of month), `W` (nearest weekday) and `#` (nth weekday) are extensions from Quartz and Spring — check your scheduler's own documentation if you need them.
What does @daily mean?
It's shorthand for `0 0 * * *` — midnight every day. The other shorthands are @yearly and @annually (`0 0 1 1 *`), @monthly (`0 0 1 * *`), @weekly (`0 0 * * 0`), @midnight (same as @daily), and @hourly (`0 * * * *`).
Does this tool send my expression anywhere?
No. Parsing and the run-time calculation happen entirely in your browser. Nothing is uploaded, logged, or stored.
Related tools
Prefer AllUtil on Google
One click adds AllUtil to your Google preferences. You'll see our tools highlighted with a Preferred badge in Search and AI answers.