Skip to main content

Cron Expression Builder

Build cron expressions visually or paste one to get plain English and next run times.

100% client-side⌁ nothing leaves your browser⎘ instant results
Hours
Days of week
Months (every)
Minutes & days of month
Minutes
Days of month (every)
Every 15 minutes, between 09:00 and 17:00, on Monday through Friday

Next runs in UTC and UTC.

#Local (UTC)UTC
1Mon, Jun 15, 2026, 09:00 AM2026-06-15 09:00
2Mon, Jun 15, 2026, 09:15 AM2026-06-15 09:15
3Mon, Jun 15, 2026, 09:30 AM2026-06-15 09:30
4Mon, Jun 15, 2026, 09:45 AM2026-06-15 09:45
5Mon, Jun 15, 2026, 10:00 AM2026-06-15 10:00
100%
client-side compute
0
uploads — verify in devtools
96
free tools in the directory
0
network requests per keystroke

How it works

Cron syntax is five fields — minute, hour, day-of-month, month, day-of-week — each accepting a number, a range (1-5), a list (1,15), a step (*/10), or *for "every". It is compact, ancient and easy to get subtly wrong. This builder works in both directions: click values in the visual selectors and the expression updates, or paste an expression and the selectors light up to show what it actually says. Two-way sync means you can sanity-check an inherited crontab line as fast as you can author a new one.

The English explanation is generated from the parsed fields, not pattern-matched from a lookup table, so arbitrary combinations read correctly: */15 9-17 * * 1-5becomes "every 15 minutes, between 09:00 and 17:59, Monday through Friday". Below it, the next five run times are computed by stepping a real calendar forward minute-by-candidate — handling month lengths, year rollovers and the notorious day-of-month/day-of-week OR rule — and shown in both your local timezone and UTC, because the gap between those two columns is where most production scheduling bugs live.

The OR rule deserves emphasis: when both day fields are restricted, classic cron fires when either one matches. 0 0 13 * 5is "the 13th of each month, plus every Friday" — not "Friday the 13th". The preview makes this concrete: you will see consecutive Fridays appear in the run list alongside the 13ths. Schedules that look right and run wrong are exactly what a next-runs preview is for.

Preset chips cover the common cases (@hourly, @daily, @weekly, @monthly equivalents) as starting points. Note that this tool speaks standard five-field cron: Quartz-style expressions with a leading seconds field, or extensions like L and #, belong to specific schedulers and are not portable. If your platform supports them, its documentation — not generic cron — is the authority. For converting run times across zones, the Unix Timestamp converter pairs well with this page.

Frequently asked questions

What is the day-of-month + day-of-week gotcha?

When both the day-of-month and day-of-week fields are restricted (neither is *), classic cron fires when EITHER matches — an OR, not an AND. So `0 0 13 * 5` runs on the 13th of every month AND on every Friday, not only on Friday the 13th. This surprises almost everyone. This tool implements and documents the OR rule, and the next-runs preview makes the behavior visible before you ship the schedule.

How are timezones handled?

A cron expression has no timezone of its own — it fires in whatever zone the scheduler process uses, which is often UTC on servers and containers. That is why this tool shows the next runs in both your local timezone and UTC side by side. A `0 9 * * 1-5` standup reminder configured on a UTC server fires at 9:00 UTC, which may be the middle of the night locally. Always confirm the daemon's zone.

Do some cron variants have a seconds field?

Yes. Classic Unix cron uses five fields (minute, hour, day-of-month, month, day-of-week). Quartz (Java) and several modern schedulers prepend a seconds field for six, and Quartz adds an optional year for seven. Pasting a six-field Quartz expression into a five-field system shifts every field by one position and silently produces a wrong schedule. This tool is strictly five-field; trim a leading seconds field before pasting.

What do @daily and the other shortcuts mean?

Most cron implementations accept named shortcuts: @hourly is `0 * * * *`, @daily (and @midnight) is `0 0 * * *`, @weekly is `0 0 * * 0`, @monthly is `0 0 1 * *`, and @yearly is `0 0 1 1 *`. There is also @reboot, which runs once at daemon start and has no field equivalent. The preset chips here load the field equivalents so you can tweak them — start from @daily and shift the hour rather than writing from scratch.

Built by FORG — AI cost observability for agentic coding. Free tools, no signup, nothing leaves your browser.

Learn about FORG