Cron Expression Generator and Parser
Build a schedule visually or paste one to read it in plain English — with the next eight run times, so you can check it fires when you think it does.
Runs entirely in your browser. Nothing you type is uploaded.
Common schedules
What it does
Runs at 09:00, on Mondays.
Next 8 runs
Working out the next run times…
Field by field
| minute (0) | 0 |
|---|---|
| hour (9) | 9 |
| day of month (*) | every day of month |
| month (*) | every month |
| day of week (1) | Monday |
The same schedule in every dialect
Generated from the builder settings, not by copying the text across — which is the point. The day numbers and field counts differ.
| Scheduler | Expression | Fields |
|---|---|---|
| Standard cron | 0 9 * * * | 5 |
| node-cron | 0 0 9 * * * | 6 |
| Quartz | 0 0 9 * * ? | 6 |
| AWS EventBridge | cron(0 9 * * ? *) | 6 |
Standard cron specifics
- Five fields, with no seconds — the finest resolution is one minute.
- Day-of-week accepts 0 to 7, where both 0 and 7 mean Sunday.
- When day-of-month and day-of-week are both restricted, the job runs when EITHER matches — not both. This surprises almost everyone the first time.
- Supports the @yearly, @monthly, @weekly, @daily and @hourly shorthands.
How cron expressions work
A cron expression is a list of fields, each saying which values of one time unit the job should run at. Standard cron uses five:
┌───────────── minute (0 - 59)
│ ┌─────────── hour (0 - 23)
│ │ ┌───────── day of month (1 - 31)
│ │ │ ┌─────── month (1 - 12)
│ │ │ │ ┌───── day of week (0 - 7, 0 and 7 both Sunday)
│ │ │ │ │
* * * * *Every field takes the same four constructs, which is most of what you need:
| Syntax | Means | Example |
|---|---|---|
* | Every value | * * * * * — every minute |
5 | One specific value | 5 * * * * — at 5 minutes past every hour |
1,15,30 | A list | 0 9,17 * * * — at 09:00 and 17:00 |
9-17 | A range | 0 9-17 * * * — hourly through the working day |
*/5 | A step | */5 * * * * — every 5 minutes |
The three traps
1. Both day fields restricted means OR, not AND
This is the one that causes real incidents. 0 9 1 * 1 looks like “09:00 on the first of the month, if it is a Monday”. It actually means the 1st of the month, or any Monday — around five runs a month instead of one or two a year.
The rule: when day-of-month and day-of-week are both restricted, standard cron ORs them. Leave one as *. Quartz and EventBridge avoid the ambiguity by requiring ? in whichever field you are not using.
2. Day-of-week numbering is not portable
| Day | Standard / node-cron | Quartz / EventBridge |
|---|---|---|
| Sunday | 0 or 7 | 1 |
| Monday | 1 | 2 |
| Friday | 5 | 6 |
| Saturday | 6 | 7 |
A copied expression is off by one day, and it will still parse cleanly — so nothing tells you until the job runs on Sunday instead of Monday. Using names (MON, FRI) sidesteps the whole problem where the scheduler accepts them.
3. Timezones
Unix crontab runs in the server’s local timezone. Kubernetes CronJobs default to UTC. EventBridge is UTC unless the rule says otherwise. A schedule that is correct on your laptop can be several hours out in production, and daylight saving moves it twice a year.
Quartz and EventBridge extras
Both add characters that standard cron does not have. They are worth knowing because they express things you would otherwise fake with a date check inside the job.
| Token | Field | Meaning |
|---|---|---|
? | Day of month or day of week | No specific value. Exactly one of the two must use it |
L | Day of month | The last day of the month |
L-3 | Day of month | Three days before the end of the month |
15W | Day of month | The weekday nearest the 15th, without crossing into another month |
LW | Day of month | The last weekday of the month |
6L | Day of week | The last Friday of the month (Quartz 6 is Friday) |
2#1 | Day of week | The first Monday of the month |
The full field reference for all four dialects is in the cron cheat sheet, and the differences are compared side by side in cron syntax compared.
Frequently asked questions
What do the five fields mean?
In standard cron, 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 are Sunday). So 30 6 * * 1 means 06:30 every Monday. Quartz and node-cron add a leading seconds field, and Quartz and EventBridge add a trailing year.
Why does my job run more often than the expression suggests?
Almost certainly the day-of-month / day-of-week OR rule. In standard cron, if BOTH day fields are restricted, the job runs when EITHER matches — not both. So 0 9 1 * 1 runs on the 1st of the month AND on every Monday, roughly five times a month rather than once. Set one of the two fields to * and put the real condition in the other.
Why did my expression break when I moved it to Quartz?
Two reasons, usually at once. Quartz takes six or seven fields rather than five, so every value shifts by one position. And Quartz numbers day-of-week 1–7 with 1 as Sunday, so a Unix "1" (Monday) becomes a Quartz "2". A five-field expression pasted into Quartz either fails to parse or runs a day early.
How do I run something on the last day of the month?
In Quartz or AWS EventBridge, use L in the day-of-month field: 0 0 23 L * ?. Standard cron and node-cron have no equivalent — the usual workaround is 28-31 plus a date check inside the job itself, because otherwise it fires on up to four days every month.
What timezone does a cron job use?
It depends on the scheduler, and getting it wrong is the most common cron incident there is. Unix crontab uses the server’s local timezone (settable with a CRON_TZ or TZ line). Kubernetes CronJobs default to UTC. AWS EventBridge evaluates in UTC unless the rule specifies a timezone. The preview here shows your local time by default with a UTC toggle, so you can compare both against what you configured.
What happens to a job during a daylight-saving change?
On the spring-forward night, a job scheduled inside the skipped hour may not run at all; on the autumn night, one scheduled inside the repeated hour may run twice. Schedulers differ in how they compensate. If a job must run exactly once a day, schedule it outside 01:00–03:00 local, or run it in UTC.
Is */5 the same as running every 5 minutes?
Almost. */5 fires at :00, :05, :10 and so on — aligned to the clock, not to when the job was created. It also resets at the top of each hour, so a step that does not divide 60 evenly leaves a short gap: */7 fires at :56 and then :00, four minutes later. AWS rate(5 minutes) behaves differently again, counting from when the rule was created.
Does this send my expression anywhere?
No. Parsing, description and the run-time preview are all computed in your browser. Nothing is uploaded, and no schedule you paste is logged.
Related tools and guides
- TextRegex Tester
Test a pattern against your text and get a plain-English explanation of what it does.
- DataJSON Formatter and Validator
Prettify, minify and validate JSON — with the exact line and column of any error.
- DataJSON to YAML Converter
Convert JSON to YAML and back, with validation in both directions.
- GuideHow to run a cron job every 5 minutes
The correct expression, the common mistake that silently drifts, and every dialect variant.
- GuideCron syntax compared: standard, Quartz, node-cron and EventBridge
Field counts, day-of-week numbering and special characters, and why a copied expression can silently run at the wrong time.
- ReferenceCron Cheat Sheet
Field order, special characters, dialect differences and a table of common schedules.