PK Systems PK Systems
Developer tools

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.

Cron Expression Generator & Explainer

Cron expression

* * * * *

Adjust any field above to see the expression update.

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?
No — this generator emits classic 5-field Unix cron. Quartz and Spring use a 6 or 7-field variant that adds a leading seconds field and a trailing optional year. The structure is similar, so you can usually paste this output and prefix 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?
When you click Explain, the tool walks the expression forward and shows you the next five times it will fire, rendered in your browser's local timezone. The whole calculation happens locally — your cron strings never leave the page.
What about timezones?
The generator and the next-runs preview both treat the expression as if it ran in your browser's local timezone. Production cron schedulers vary: Linux 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"?
Classic Unix cron has no native "last day" token, so the closest portable approximation is 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?
Not with a single cron expression — cron steps reset every hour, so */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?
When the clock springs forward, jobs scheduled in the missing hour are usually skipped. When it falls back, jobs in the repeated hour run twice. To avoid this, run cron in UTC (cron.timezone = 'UTC' or set TZ=UTC in the crontab) and convert to local time inside the job — UTC has no DST.