Cron Decoder - decode any cron expression online
Every 15 minutes, between 09:00 and 17:59, Monday through Friday.
Next runs · UTC
- —
- —
- —
- —
- —
Calendar
November 2026 · UTC
0 runs
About this tool
*/15 9-17 * * 1-5, decodes to “Every 15 minutes, between 09:00 and 17:59, Monday through Friday”. A cron reader, translator, interpreter and evaluator all do this same job, so this one page covers all four.What you get when you paste a cron
- Labelled fields. Each token sits in its own editable field (minute, hour, day of month, month, day of week) with a help popover that gives the range and syntax.
- One English sentence for the whole expression, written by cronstrue in English with a 24-hour clock.
- Next runs: the next five timestamps from now, in the IANA timezone you pick.
- A month calendar with Prev, Today and Next. On mobile it becomes an agenda of up to 30 runs from the visible month.
- Validation. An invalid field is highlighted with a readable parser error, and a fixed day and month that can't exist, like
0 0 30 2 *, is reported as never firing. - Copy actions: Copy, Copy English, Copy link, Run in Crontap, and Copy as, which rewrites the schedule as a crontab line,
vercel.json, GitHub Actions, Kubernetes CronJob, AWS EventBridge or Quartz, or exports the next runs as Markdown.
Standard mode reads five fields. Extended mode adds a leading seconds field and a trailing year; if you paste six fields while in Standard mode, CronTool asks before switching. There's no dialect selector, so the decoder tells you what the fields say, not whether your target scheduler accepts them.
Paste only the schedule, not a whole crontab line: the decoder doesn't parse the command after the five fields. To read a full crontab, save crontab -l to a file and upload it to the multi-cron visualizer, which takes the first five fields of each line and skips comments, variables and @daily-style lines.
How to read a cron expression field by field
Read the five fields from left to right: minute, hour, day of month, month and day of week. A run happens in every minute where all five match. Here is the editor's default, */15 9-17 * * 1-5, taken apart:
*/15in the minute field steps through the hour in 15s, so minutes 0, 15, 30 and 45.9-17in the hour field is every hour from 09 to 17 inclusive. The last run is 17:45, which is why the sentence says “between 09:00 and 17:59” rather than “until 17:00”.*and*leave day of month and month open, so any date qualifies.1-5in the day of week field is Monday (1) through Friday (5).
Put together, that's four runs an hour for nine hours, or 36 runs on each weekday and none at the weekend, which is exactly what the calendar shows. When a sentence surprises you, this is the check to do: read each field on its own, then see which minutes survive all five.
Common cron expressions and what they decode to
These are CronTool's exact sentences in Standard mode:
* * * * *→ Every minute*/5 * * * *→ Every 5 minutes0 * * * *→ Every hour0 0 * * *→ At 00:000 9 * * 1-5→ At 09:00, Monday through Friday30 8,17 * * *→ At 08:30 and 17:300 0 1 * *→ At 00:00, on day 1 of the month0 0 1,15 * *→ At 00:00, on day 1 and 15 of the month0 0 L * *→ At 00:00, on the last day of the month (Lis an extension, not classic Unix cron)
Quartz expressions need Extended mode, because Quartz puts seconds first and allows an optional year at the end:
0 0 0 ? * MON-FRI→ At 00:00, Monday through Friday0 0 0 LW * ?→ At 00:00, on the last weekday of the month0 0 9 ? * MON#2→ At 09:00, on the second Monday of the month
AWS EventBridge also uses six fields, but minutes first with a required year, and one day field must be ?: weekdays at midnight is cron(0 0 ? * MON-FRI *). CronTool has no AWS mode and favours the seconds-first reading for six fields, so don't paste the AWS form. Decode the schedule here, then use Copy as → AWS EventBridge, which adds the ? and the year for you.
Reading ?, L, W and # in extended cron
These four aren't part of classic Unix cron. Quartz and AWS document them, robfig/cron accepts only ?, and other libraries vary, so the sentence tells you what the field means, not that your scheduler accepts it.
?means “no specific value”. Quartz and AWS require it in one of the two day fields, which is why0 0 0 ? * MON-FRIleaves day of month open and lets day of week decide.Lmeans last. In day of month,0 0 L * *is the last day of every month; the last-day-of-month guide covers each dialect's version.Wpicks the weekday nearest a date, so15Wis the Monday to Friday closest to the 15th, andLWis the last weekday of the month.#picks the nth weekday of the month:MON#2is the second Monday.
Where the English sentence can mislead you
A scheduler checks each minute against every field and fires when they all match. The sentence summarises those rules well, but a few cases only show up once you look at real dates.
- When both day fields are set, either one triggers a run.
0 9 1 * 1decodes to “At 09:00, on day 1 of the month, and on Monday”, and Unix cron runs it on the 1st and on every Monday, not only on Mondays that fall on the 1st. Quartz and AWS avoid this by requiring?in one day field. - Steps restart at the field boundary.
0 0 */7 * *reads as “At 00:00, every 7 days”, but it fires on the 1st, 8th, 15th, 22nd and 29th, then starts over on the 1st. Ranges don't wrap either:50-10/20isn't minutes 50, 10 and 30. CronTool still writes a sentence for it, so write the list out instead:10,30,50. - Weekday numbers differ by dialect. Unix cron accepts 0 or 7 for Sunday, while Quartz and AWS count 1 to 7 with Sunday as 1. CronTool's sentence uses Unix numbering, so a numeric Quartz weekday reads one day off. Names like
MONmean the same thing everywhere. - Some dates never come.
0 0 30 2 *decodes to “At 00:00, on day 30 of the month, only in February”, which sounds fine and never fires; so does0 0 31 2 *.0 0 29 2 *runs only in leap years, and0 0 31 * *skips February, April, June, September and November. - Daylight saving bends local times. A job at 02:30 local time has no 02:30 on the spring-forward night and two of them in autumn. Schedulers handle that differently, so check yours, or keep jobs out of the 01:00 to 03:00 window or in UTC.
That's why CronTool leads with a calendar rather than a long list of timestamps. A list is fine for something that fires every few minutes, but it hides the shape of slower schedules: on the calendar you see the extra Mondays next to the 1st, the missing 31sts, or a weekend run you didn't mean. Step through a few months with Prev and Next before you trust a monthly job. With several jobs, the multi-cron visualizer puts them on one calendar and lists up to five pairs that fire in the same minute.
When another CronTool page fits better
The decoder answers “what does this cron mean, and when does it run?”. A few neighbouring questions have their own pages:
- Cron tester: is the syntax valid before you ship it?
- Cron debugger: the schedule looks right, so why isn't the job running?
- Cron analyzer: how do several crons overlap and bunch up?
- Cron parser: which library parses cron in your language, for decoding in code?
- Cron builder: you know the schedule and need the expression.
- Cron cheatsheet: field ranges, operators and dialect differences on one page.
Examples
- 0 18 * * *Every day at 18:00
- 0 */5 * * *Every 5 hours
- 0 18 * * 1-5Weekdays at 18:00
- 0 0 1 * *Once a month, on the 1st at midnight
Cheatsheet
Full cheatsheet| Field | Req. | Range | Wildcards |
|---|---|---|---|
| minute | yes | 0-59 | , - * / |
| hour | yes | 0-23 | , - * / |
| day of month | yes | 1-31 | , - * / |
| month | yes | 1-12 or JAN-DEC | , - * / |
| day of week | yes | 0-6 or names; some dialects use 0-7 or 1-7 — see Dialects | , - * / |
Frequently asked questions
Syntax
How do I decode a cron expression?
Paste it into the editor. CronTool fills the labelled fields, writes one plain-English sentence, lists the next five runs in the selected timezone and plots the month on a calendar. A cron reader, cron translator, interpreter or evaluator does the same job under another name. Expression: */15 9-17 * * 1-5
What does each field of a cron expression mean?
Standard cron has five fields: minute 0-59, hour 0-23, day of month 1-31, month 1-12 and day of week 0-7, where 0 and 7 are Sunday. Extended mode adds seconds 0-59 at the start and a year 1970-2099 at the end. Each field's help popover shows its range and syntax.
Cron field referenceWhat do *, ,, - and / mean in cron?
* matches every value, , lists values such as 1,15, - sets a range such as 9-17, and / steps through a range. In the minute field, */15 means 0, 15, 30 and 45, and 10-59/15 means 10, 25, 40 and 55.
How does the decoder explain L, W, #, and ??
L means last, W the nearest weekday, # the nth weekday, and ? leaves one day field unspecified, so 0 0 9 ? * MON#2 reads as 09:00 on the second Monday. These aren't classic Unix syntax: Quartz and AWS document them, while robfig/cron accepts only ?. Expression: 0 0 9 ? * MON#2
What's the difference between decoding and writing a cron?
Decoding takes a cron string and explains it. Writing goes the other way: you start from the schedule you want and compose the string. CronTool doesn't turn English sentences into cron, so use the cron builder to compose one field by field.
Cron builderCan I paste a whole crontab line, command included?
Paste only the five schedule fields; the decoder doesn't parse the command. For a whole crontab, save crontab -l to a file and upload it to the multi-cron visualizer, which reads the first five fields of each line and skips comments, variables and @daily-style lines.
Can I decode @daily, @hourly and other crontab shortcuts?
Not directly, because the editor expects fields, so type the expansion instead. @hourly is 0 * * * *, @daily and @midnight are 0 0 * * *, @weekly is 0 0 * * 0, @monthly is 0 0 1 * * and @yearly is 0 0 1 1 *. @reboot runs when the cron daemon starts, so it has no schedule to decode.
Why does my cron expression have six or seven fields?
It usually comes from Quartz or another scheduler that puts a seconds field first, and Quartz also allows a year at the end. Switch to Extended mode to decode it; if you paste six fields in Standard mode, CronTool offers the switch. AWS EventBridge is the exception: its six fields start with minutes and end with a required year.
Quartz cron expressionsTiming
What's the difference between */5 and 5 in the minute field?
*/5 is a step: every 5 minutes, at minute 0, 5, 10 and so on through 55. A plain 5 is one value, minute 5 of every hour, so 09:05, 10:05 and onwards. Expression: */5 * * * *
When will my cron run next?
Paste the expression and read Next runs: the next five run times from now, in the timezone shown in the picker. For a longer view, the calendar marks every run in the month, and on mobile it lists up to 30 of them as an agenda. Expression: */15 9-17 * * 1-5
Can I evaluate a cron from a specific start date?
Not in the run list: Next runs always starts from now and shows five timestamps. The calendar can move to other months with Prev and Next and computes that month's runs, which is how you check a future date.
Can I decode several cron expressions at once?
Yes, in the multi-cron visualizer. It plots every schedule on one month calendar and lists up to five expression pairs that fire in the same minute.
Multi-cron visualizerDays and months
How does the decoder read two restricted day fields?
Unix cron runs the job when either one matches: 0 9 1 * 1 runs at 09:00 on the 1st of every month and on every Monday. The sentence reads “on day 1 of the month, and on Monday”, so check the calendar. Quartz and AWS require ? in one day field instead. Expression: 0 9 1 * 1
Why doesn't */7 in the day field mean every seven days?
Steps work inside one field and restart at its boundary. 0 0 */7 * * fires on the 1st, 8th, 15th, 22nd and 29th, then again on the 1st, so the gap around month end depends on how long the month is. Expression: 0 0 */7 * *
Why can every decoded field look legal yet produce no run?
Legal fields don't guarantee a real date. 0 0 30 2 * and 0 0 31 2 * ask for February 30 and 31, so CronTool reports that they never fire. That check covers fixed day and month combinations only. Expression: 0 0 30 2 *
Does 0 0 29 2 * ever run?
Yes, but only on February 29, so it fires in leap years and the next run can be years away. In the same way, 0 0 31 * * skips February, April, June, September and November. Expression: 0 0 29 2 *
Timezones and DST
Which timezone are the decoded runs in?
The sentence describes clock fields only. Next runs and the calendar use the IANA timezone selected in the picker, so set it to the zone your scheduler uses. Vercel cron, for example, runs in UTC.
Timezone referenceHow do I check a cron around a daylight-saving change?
Pick your scheduler's timezone and move the calendar to the transition month. A job between 01:00 and 03:00 local time can hit a missing hour in spring and a repeated hour in autumn, and schedulers handle that differently, so check yours or schedule in UTC. Expression: 30 2 * * *
DST behaviorPlatforms
Is Sunday 0, 1 or 7 in a cron expression?
Unix cron accepts 0 or 7 for Sunday. Quartz and AWS count 1 to 7 with Sunday as 1. CronTool's sentence uses Unix numbering even in Extended mode, so write Quartz and AWS weekdays as names such as MON or SUN.
Can the decoder handle AWS or Quartz cron?
Quartz works in Extended mode, which reads seconds first and an optional year. AWS EventBridge puts minutes first with a required year, and CronTool has no AWS mode, so decode the schedule here and use Copy as → AWS EventBridge. CronTool doesn't validate a target dialect.
Dialect matrixCan the decoder describe cron in languages other than English?
No. The sentence comes from cronstrue, configured for English only with a 24-hour clock.
Debugging
How accurate is the decoded sentence?
CronTool validates with @datasert/cronjs-parser, writes the sentence with cronstrue and computes runs with @datasert/cronjs-matcher. It's a preview, not an emulator of every scheduler, so confirm dialect rules, day-field behaviour and DST against the system that runs the job.
Can I decode a cron without actually running it?
Yes. CronTool only computes dates and never executes the scheduled command. It isn't fully local, though: on the production site, PostHog analytics events can include the cron strings you validate, copy or share.
Can the decoder explain why my command failed?
No. It explains and validates the schedule only. It can't see your server's PATH, environment, permissions, logs or command result, and it never executes commands; start from the cron debugger for runtime failures.
Cron debuggerWrite the cron here. Run it on Crontap.
Point Crontap at any URL. Pick any cron. Done.
WordPress, Shopify, Railway, Cloud Run, Vercel, HubSpot, Ghost, your own box. If it answers HTTP, Crontap can drive it on a clock you can read, in the timezone that actually matters, and page you when something breaks.
1.9k+ teams · Free forever tier · No credit card