Cron Expression Generator & Explainer
Build cron expressions visually field-by-field, or paste an existing one to get a plain-English explanation and the next five run times.
What is a cron expression?
A cron expression is a five-field schedule used by Unix-style task schedulers, CI systems, Kubernetes CronJobs, AWS EventBridge, GitHub Actions and most modern job runners. Each field controls one unit of time — minute, hour, day of month, month, and day of week — and supports four shorthands: * (any), a comma-separated list (0,15,30,45), a range (1-5), and a step (*/10). Combine them and you can describe almost any recurring schedule without writing a calendar by hand.
How to use this generator
Pick a preset for an instant starting point, or build the expression field by field. Each field has four modes: Every emits *; Specific list takes comma-separated values; Range takes a start–end pair; Step takes an interval (*/N) with an optional starting offset. The expression and a plain-English description update live as you change anything. To go the other way, drop a cron string into the parse box at the bottom — the tool decodes it into human-readable form and shows you the next five fire times in your local timezone.
Field reference
Minute: 0–59. Hour: 0–23. Day of month: 1–31. Month: 1–12 (January = 1). Day of week: 0–6 with Sunday = 0 in classic Unix cron — 7 is also accepted as Sunday on most modern parsers. When both day of month and day of week are set to non-* values, classic cron triggers on EITHER condition (a logical OR), which surprises a lot of people. Pick one or the other for predictable behaviour.
Frequently asked questions
Does this match Quartz / Spring cron?
0 to get a Quartz-compatible string, but special tokens like L (last) and W (weekday) are Quartz-only and won't appear here.How does the explainer compute the next runs?
What about timezones?
crond uses the system timezone, AWS EventBridge defaults to UTC, GitHub Actions uses UTC, Kubernetes uses the cluster timezone. Always confirm the timezone of your runner before deploying.How do I express "the last day of the month"?
59 23 28-31 * *, which fires every day from the 28th onward at 23:59. The job itself should check date -d 'tomorrow' +%-d = 1 (or your language's equivalent) and skip if it isn't actually month-end. Quartz cron supports L for this — but Quartz expressions don't run on plain Linux cron.Can I run a job every 90 minutes?
*/90 doesn't work. The closest workaround is two expressions: 0 0,3,6,9,12,15,18,21 * * * and 30 1,4,7,10,13,16,19,22 * * *, which together fire every 90 minutes. Easier still: schedule every 30 minutes and exit 0 from the script when it isn't the right slot.Why does my job fire twice on DST changeover?
cron.timezone = 'UTC' or set TZ=UTC in the crontab) and convert to local time inside the job — UTC has no DST.
EN
PT
ES