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
Next run times (your local time)
 

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

PositionFieldAllowed valuesSpecial characters
1Minute0–59* , - /
2Hour0–23* , - /
3Day of month1–31* , - /
4Month1–12 or JAN–DEC* , - /
5Day of week0–7 or SUN–SAT (0 & 7 = Sunday)* , - /

Special characters

SymbolMeaningExample
*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

ExpressionMeaning
*/15 * * * *Every 15 minutes
0 * * * *At the top of every hour
30 2 * * *Every day at 02:30
0 9 * * 1-5At 09:00 on weekdays (Mon–Fri)
0 0 1 * *At midnight on the 1st of every month
0 0 * * 0At midnight every Sunday
0 22 * * 1-5At 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:

MacroEquivalent
@yearly / @annually0 0 1 1 *
@monthly0 0 1 * *
@weekly0 0 * * 0
@daily / @midnight0 0 * * *
@hourly0 * * * *

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.

Related tools

Explore more tools

Browse all 58 tools →