Why Cron Expressions Are Hard to Read
Cron has been around since Unix's early days, and the syntax reflects that era: dense, positional, and requiring you to hold five independent fields in your head simultaneously. A string like */15 9-17 * * 1-5 contains a complete scheduling specification, but unless you work with cron daily, decoding it takes conscious effort every time.
The problem compounds when you're reviewing someone else's infrastructure code, auditing a CI/CD pipeline, or inheriting a server you didn't set up. Misreading a cron expression by even one field can mean a job runs at midnight instead of noon, or fires every minute instead of every month. The consequences range from annoying to catastrophic depending on what the job does.
The Five-Field Structure
Standard cron expressions use exactly five space-separated fields, read left to right:
- Minute — 0 to 59
- Hour — 0 to 23 (24-hour clock)
- Day of month — 1 to 31
- Month — 1 to 12 (or JAN–DEC)
- Day of week — 0 to 7 (both 0 and 7 mean Sunday, or use SUN–SAT)
Some schedulers add a sixth field for seconds (Quartz, Spring Scheduler) or a seventh for year. These variants look similar but behave differently — a seconds-first expression like 0 */5 * * * * will be misinterpreted by a tool that expects the standard five-field format. The parser handles the standard five-field POSIX format; check your scheduler's documentation if you're on a non-standard variant.
Special Characters and What They Mean
The cryptic parts of any cron expression usually come from one of four special characters:
*— Wildcard. Matches every valid value for that field.* * * * *runs every minute./— Step.*/5means "every 5 units."*/15in the minute field means at 0, 15, 30, and 45.-— Range.9-17means every value from 9 to 17 inclusive.,— List.1,3,5means the 1st, 3rd, and 5th. Combine with ranges:1-5,10.
These characters can be combined in a single field. 0,30 9-17/2 * * 1-5 reads as: at minutes 0 and 30, every 2 hours from 9am to 5pm, weekdays only. That's 10 executions per weekday — something easy to miscount without a parser.
Common Cron Patterns
A handful of patterns cover the vast majority of scheduled jobs you'll encounter:
* * * * *— Every minute (common for health checks, polling jobs)*/5 * * * *— Every 5 minutes0 * * * *— Every hour on the hour0 0 * * *— Daily at midnight0 9 * * 1-5— Weekdays at 9am0 0 1 * *— First day of every month at midnight0 0 * * 0— Every Sunday at midnight0 0 1 1 *— Once a year, January 1st at midnight
Knowing these patterns by sight is useful, but edge cases still trip people up. What does 0 0 31 * * do in February? (It doesn't run — the 31st doesn't exist.) What about 0 0 * * 7? (Runs Sunday — 7 is treated the same as 0 on most implementations.) These are the kinds of gotchas that a parser with concrete next-run timestamps surfaces immediately.
Verifying with Next Run Times
The most useful feature of a cron parser isn't the English translation — it's seeing the next 10 scheduled execution times in your local timezone. This lets you verify the expression before it goes into production.
For example, if you expect a job to run every weekday morning but the next-run list shows Saturday and Sunday dates, you know the day-of-week field is wrong. If times are listed at 1am instead of 9am, the hour field is using UTC while you're thinking in local time — a very common source of confusion in cloud environments where servers default to UTC.
Before deploying any cron-scheduled job, treat the next-run list as a checklist:
- Does the first run time look right given current time?
- Is the spacing between runs what you expect?
- Do any runs land on days or hours that should be excluded?
- Are there any unexpected gaps (e.g., missing runs at month boundaries)?
When to Use a Cron Parser
A cron expression parser is most useful in three situations. First, when you're reading code or config you didn't write and need to quickly understand what a job does without running it. Second, when you're writing a new expression and want to confirm it before commit. Third, when debugging a job that seems to be running at unexpected times — paste the expression in and compare the output against your assumptions.
It's also a useful reference tool when onboarding junior developers or DevOps engineers who haven't memorised the syntax yet. Rather than explaining the fields every time, share a parsed result and let the human-readable description do the teaching.
Decode any cron expression instantly.
Paste your expression and get a plain-English explanation plus the next 10 scheduled run times.