Reading a cron expression
A cron expression is a compact way to describe a repeating schedule, but the
five or six space-separated fields are easy to misread. This tool parses the
expression the same way a scheduler does and tells you, in plain English,
exactly when the job will fire. Paste something like 0 9 * * 1-5 and it reads
back “at 09:00, on Monday, Tuesday, Wednesday, Thursday and Friday”.
How it works
Each field is expanded into the concrete set of values it matches. The parser
handles four operators per field: * for every value, a range such as 1-5,
a comma list such as 1,15,30, and a step such as */15 or 10-50/5. Month
and weekday names like JAN or MON are mapped to numbers first, and 7 in
the weekday field is normalised to 0 so Sunday is recognised either way.
Once every field is a set of numbers, the tool decides how to phrase it. If minutes and hours both match everything it says “every minute”; if only the minute is fixed it says “at minute N of every hour”; otherwise it lists the specific clock times. It then appends any day-of-week, day-of-month, and month restrictions it found.
*/15 9-17 * * 1-5 -> every 15 minutes during 09:00-17:00 on weekdays
0 0 1 1 * -> at 00:00 on day-of-month 1 in January
0 6 * * MON-FRI -> at 06:00, Monday through Friday
30 23 L * * -> not handled (non-standard L extension)
Five-field vs. six-field cron
The classic Unix crontab uses five fields (minute through day-of-week). Quartz
Scheduler, many Spring Boot job runners, and some cloud platforms prepend a
seconds field, making six total. This tool auto-detects the count: five fields
use the Unix layout, six fields treat the first as seconds.
When copying an expression between systems — say from a Quartz-based Java app to AWS EventBridge — always check which convention the target expects. A five-field expression that starts with a seconds value will misfire completely, and the error is invisible until you notice the job ran at the wrong time.
Common expressions decoded
| Expression | Plain English |
|---|---|
* * * * * | Every minute |
0 * * * * | At the start of every hour |
0 0 * * * | At midnight every day |
0 0 * * 0 | At midnight every Sunday |
0 0 1 * * | At midnight on the 1st of every month |
0 9-17 * * 1-5 | Every hour from 09:00 to 17:00 on weekdays |
*/5 * * * * | Every 5 minutes |
0 0 1 1 * | At midnight on 1 January |
Tips and notes
When both the day-of-month and day-of-week fields are restricted, classic cron runs the job if either one matches, not both. The tool lists each restriction separately so you can catch an unintended OR — this is one of the most frequent sources of schedules that fire on unexpected days. If you need a seconds-resolution schedule, supply six fields and the leading field is interpreted as seconds, the convention used by Quartz and similar schedulers. Everything runs locally in your browser with no server calls.