Cron Expression Generator & Parser
Paste any cron expression to see it explained in plain English with the next run times, or
build one from the dropdowns below. Ranges, steps, lists, month/weekday names and
@daily-style macros are all supported. Everything runs in your browser — nothing
is uploaded.
Every 15 minutes.
Build from dropdowns
How the tool works
Type or paste a cron expression in the box and it is parsed the moment you stop typing: the five fields are validated, translated into a sentence you can read, and used to compute the upcoming times the job would fire — all in your browser, with no server round-trip. Prefer to start from scratch? Open Build from dropdowns, pick a frequency, and a valid expression is written into the box for you. The preset buttons fill in the most common schedules in one click.
The five cron fields
| Position | Field | Allowed values | Special characters |
|---|---|---|---|
| 1 | Minute | 0–59 | * , - / |
| 2 | Hour | 0–23 | * , - / |
| 3 | Day of month | 1–31 | * , - / |
| 4 | Month | 1–12 or JAN–DEC | * , - / |
| 5 | Day of week | 0–7 or SUN–SAT (0 & 7 = Sunday) | * , - / |
Special characters
| Symbol | Meaning | Example |
|---|---|---|
* | Every value in the field. | * in the hour field = every hour |
, | A list of specific values. | 1,15,30 = at minute 1, 15 and 30 |
- | An inclusive range of values. | 9-17 in hour = 9am through 5pm |
/ | A step — “every n” starting from the range start. | */15 = every 15 minutes; 5/20 = 5, 25, 45 |
Common cron expressions
| Expression | Meaning |
|---|---|
*/15 * * * * | Every 15 minutes |
0 * * * * | At the top of every hour |
30 2 * * * | Every day at 02:30 |
0 9 * * 1-5 | At 09:00 on weekdays (Mon–Fri) |
0 0 1 * * | At midnight on the 1st of every month |
0 0 * * 0 | At midnight every Sunday |
0 22 * * 1-5 | At 22:00 on weekdays |
0 0 1 1 * | At midnight on 1 January (yearly) |
Shortcut macros
Many cron implementations accept a handful of named shortcuts in place of the five fields. This tool expands them before parsing, so they are explained and scheduled just like the equivalent expression:
| Macro | Equivalent |
|---|---|
@yearly / @annually | 0 0 1 1 * |
@monthly | 0 0 1 * * |
@weekly | 0 0 * * 0 |
@daily / @midnight | 0 0 * * * |
@hourly | 0 * * * * |
The day-of-month / day-of-week gotcha
The single most common cron mistake is assuming that setting both a day-of-month and a
day-of-week means “both must match”. It does not. When neither field is a bare
*, cron fires when either matches. For example
0 0 13 * 5 runs at midnight on the 13th of every month and on every
Friday — not only on Friday the 13th. To target one weekday, keep day-of-month as
*; to target one date, keep day-of-week as *. The explanation above
deliberately writes “or” whenever both fields are set, so you can spot the trap before you
deploy the job.
Where cron expressions are used
The same five-field syntax drives Unix/Linux crontab jobs, containerised
CronJob resources in Kubernetes, CI/CD schedules (GitHub Actions, GitLab CI),
serverless schedulers (cron-style triggers on AWS EventBridge and similar), and countless task
runners and application frameworks. Because the notation is shared, being able to read a cron
line at a glance — and confirm exactly when it will run — is a genuinely portable skill. Note
that some systems add a sixth field for seconds at the front, or a year field at the end; this
tool parses the classic five-field form.
Frequently asked questions
- What are the five fields of a cron expression?
- A standard cron expression has five space-separated fields, read left to right: minute (0–59), hour (0–23), day of month (1–31), month (1–12), and day of week (0–7, where both 0 and 7 mean Sunday). Each field accepts a single value, a comma-separated list, a hyphenated range, a step written with a slash, or an asterisk meaning “every value”. The schedule fires whenever the current time matches every field. Month and weekday can also be written as three-letter names such as JAN or MON.
- What does */5 mean in a cron expression?
- The slash introduces a step value, so */5 in the minute field means “every 5th minute” — that is, at minute 0, 5, 10, 15 and so on. The part before the slash sets the starting point and range: */5 starts at 0, while 5/15 starts at minute 5 and then adds 15 each time (5, 20, 35, 50). Steps can be combined with ranges too — 9-17/2 in the hour field runs every two hours between 9am and 5pm.
- Why can the day-of-month and day-of-week interact unexpectedly?
- When BOTH the day-of-month and the day-of-week fields are restricted (neither is a plain asterisk), cron runs the job when EITHER one matches, not both. So 0 0 13 * 5 means “at midnight on the 13th of the month, and also on every Friday” — not only on Friday the 13th. If you need a job that runs only on a specific weekday, leave the day-of-month as * ; if you need a specific date, leave the day-of-week as * . This parser follows that standard OR behaviour, and the plain-English explanation says “or” so the trap is visible.
- What timezone are the “next run times” shown in?
- The next run times are calculated in your own device’s local timezone, because that is what most people want to see and it needs no server. A real cron daemon, by contrast, runs in whatever timezone the server is configured for (often UTC). If your server uses a different timezone, mentally offset the times shown here, or set the server/scheduler to your timezone. The calculation itself is done entirely in your browser — the expression is never sent anywhere.
- Does this support the @daily, @hourly and other shortcuts?
- Yes. The named macros @yearly (and its alias @annually), @monthly, @weekly, @daily (and its alias @midnight) and @hourly are expanded to their five-field equivalents before parsing, so they are explained and scheduled just like a normal expression. @reboot is recognised but has no fixed schedule — it runs once when the system starts — so no run times can be listed for it.
- Is my cron expression sent to a server?
- No. Parsing, the plain-English explanation and the next-run calculation all run locally in your browser with plain JavaScript. Nothing is uploaded or stored, so it is safe to use with internal job schedules, and it works offline once the page has loaded.