Free tool

Cron expression explainer.

Paste a schedule from a crontab, a GitHub Actions workflow or a Kubernetes CronJob and read it in plain English — field by field, with the next runs in UTC or your own time zone. Nothing is uploaded.

Cron expression

“At every 15th minute past every hour from 9 through 17 on Monday through Friday.”

Minute
*/15
every 15th minute
Hour
9-17
every hour from 9 through 17
Day of month
*
every day-of-month
Month
*
every month
Day of week
1-5
Monday through Friday
Next 8 runs · UTC

Calculating…

Reviewing a schedule change? Publish the expression, its meaning and the next runs as a link, and your team comments on the line that looks wrong. Or skip the crontab: Comma Routines run a Claude skill on any cron schedule and post the report for you.

Five fields, one question

A cron expression is five filters — minute, hour, day of month, month, day of week — and the job runs in every minute that passes all of them. * lets every value through, 1,15 is a list, 9-17 a range, and */15 a step: every fifteenth value starting from the lowest. That last one catches people. */7 in the day-of-month field fires on the 1st, 8th, 15th, 22nd and 29th, then again on the 1st — so the gap at the month boundary is not seven days.

The day-field trap

Every other field narrows the schedule. The two day fields are the exception: when both are restricted, cron runs on days that match either. 0 9 1-7 * 1 reads like "9am on the first Monday" and actually means "9am on the 1st to the 7th, and also every Monday" — up to eleven runs a month instead of one. When exactly one of the two fields starts with * (as in */2), cron switches back to AND. The explainer tells you which rule applied.

Questions

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 or JAN–DEC) and day of week (0–7 or SUN–SAT, where both 0 and 7 are Sunday). Each field takes a single value, a list like 1,15, a range like 1-5, a step like */15 or 10-40/10, or * for every value. The job runs in every minute that matches all of them.
Why does my job run on days I didn't ask for?
Because of the day-of-month / day-of-week rule. When both day fields are restricted, standard cron runs the job on days that match EITHER one, not both. So 0 9 1-7 * 1 means 'the first seven days of the month, plus every Monday', not 'the first Monday'. This page flags that case. If exactly one day field starts with *, the two are combined with AND instead.
What time zone does cron use?
The time zone of the machine running the cron daemon, which on servers is usually UTC. GitHub Actions scheduled workflows are always UTC, and Kubernetes CronJobs default to the controller's zone unless you set spec.timeZone. Toggle between UTC and your local time here to see both.
Does this support seconds, L, W or #?
No, because standard cron doesn't. A six- or seven-field expression with a leading seconds field, and the ?, L, W and # characters, belong to Quartz, Spring, AWS EventBridge and some Node libraries. The explainer tells you when it sees them rather than guessing at a meaning your scheduler may not share.
What do @daily, @hourly and @weekly mean?
They are shortcuts. @hourly is 0 * * * *, @daily and @midnight are 0 0 * * *, @weekly is 0 0 * * 0 (Sunday midnight), @monthly is 0 0 1 * * and @yearly or @annually is 0 0 1 1 *. @reboot runs once when the daemon starts, so it has no schedule to show.
How do I run a report on a cron schedule?
Comma Routines take a five-field cron expression, run a Claude skill on that schedule, and publish the result as a report your team can comment on — no server, no GitHub Action, no crontab to babysit.

Related: scheduled reports with Routines · JWT decoder · YAML to JSON · JSON formatter · all free tools