Cron Expression Generator
Paste a standard five-field cron expression to read it in plain English and see exactly when it runs next, in your own time zone or in UTC. Or build one with simple controls, or start from a common example.
Cron expression
@daily, and a whole
crontab line — the command after the fifth field is ignored.
—
?
| Field | Value | Matches |
|---|
Build an expression
Pick a schedule type and adjust it. The expression above and its explanation update as you go.
0 9 * * 1-5
Next run times
Everything is calculated in your browser — nothing you type is sent anywhere.
Common examples
Choose an expression to load it into the box at the top.
| Expression | Runs |
|---|---|
| Every 5 minutes | |
| Every 15 minutes, on the quarter hour | |
| Every hour, on the hour (same as @hourly) | |
| Every 6 hours: 00:00, 06:00, 12:00, 18:00 | |
| Every day at midnight (same as @daily) | |
| 06:30 on weekdays | |
| Every 20 minutes during office hours on weekdays | |
| Noon on Saturdays and Sundays | |
| Midnight every Sunday (same as @weekly) | |
| 03:00 on the 1st of every month | |
| Midnight on the first day of each quarter | |
| Once a year on 1 January (same as @yearly) | |
| Every 13th of the month and every Friday (the OR rule) | |
| 29 February only, so once every leap year |
Syntax at a glance
| Write | Meaning | Example |
|---|---|---|
* | every value of the field | * * * * * every minute |
a,b | a list of values | 0 8,20 * * * 08:00 and 20:00 |
a-b | a range, both ends included | 0 9 * * 1-5 Monday to Friday |
*/n | every n-th value, from the lowest | */10 * * * * minutes 0, 10, 20… |
a-b/n | every n-th value inside a range | 0 8-18/2 * * * 08:00, 10:00… 18:00 |
JAN, MON | names in the month and weekday fields | 0 0 1 JAN * 1 January |
0 or 7 | Sunday in the weekday field | 0 10 * * 7 Sundays at 10:00 |
How to use the cron expression generator
- Type or paste an expression into the box at the top, for example
0 9 * * 1-5. A whole crontab line works too; the command after the fifth field is ignored. - Read the plain-English sentence and the field-by-field table. If the expression is invalid, the message names the field and the value that caused the problem.
- To build an expression instead, choose a schedule type under "Build an expression" and adjust the controls. The expression box updates as you go.
- Under "Next run times", choose how many runs to list (5 to 50) and whether cron runs in your local time zone or in UTC. Tick the box to see the other zone as well.
- Change "Start after" to list the runs after any date; "Now" returns to the current time.
How it works
A standard cron expression has five fields separated by spaces:
| Field | Allowed values |
|---|---|
| Minute | 0–59 |
| Hour | 0–23 |
| Day of month | 1–31 |
| Month | 1–12 or JAN–DEC |
| Day of week | 0–7 or SUN–SAT (0 and 7 are both Sunday) |
Inside a field, * means every value, a-b is a range including
both ends, a,b,c is a list, and /n adds a step. In the minute field
*/15 means 0, 15, 30 and 45, and 1-30/5 means 1, 6, 11, 16, 21 and
26. A step restarts every hour: */7 gives 0, 7 … 56 and then 0
again. Macros are shortcuts, for example @daily = 0 0 * * * and
@weekly = 0 0 * * 0; @reboot runs once when the cron
daemon starts and has no schedule.
A given minute is a run time when all of the following hold:
M, H, D, Mo and W are the value sets of the five fields, dom is the day of the
month and dow the day of the week (0 = Sunday). The tool walks forward from the
start time one calendar day at a time, keeps the days that pass the month test and the day
rule, and takes every allowed hour and minute of each kept day in order. Month lengths and
leap years come from the calendar (a leap year is divisible by 4, except century years not
divisible by 400). Only
runs strictly after the start time are listed; the search looks up to 400 years ahead.
Examples
Office hours. */20 9-17 * * 1-5 in UTC, starting Friday
16 October 2026, 17:30, gives Fri 16 Oct 17:40, then Mon 19 Oct 09:00 and 09:20. Nothing runs
at 18:00, because hour 18 is outside 9-17.
Both day fields set. 0 0 13 * 5 in UTC, starting
1 November 2026, gives Fri 6 Nov, Fri 13 Nov, Fri 20 Nov, Fri 27 Nov, Fri 4 Dec, Fri 11 Dec
and Sun 13 Dec, all at 00:00. It runs on every Friday and on every 13th; 13 November 2026 is
both, and the job still runs once.
Day 31. 0 0 31 * * starting 1 January 2026 runs on 31 January,
31 March, 31 May, 31 July, 31 August, 31 October and 31 December: seven times a year. Shorter
months are skipped, not moved to the 30th.
Clock change. On a device set to Central European Time,
30 2 * * * starting Friday 27 March 2026, 12:00, lists Sat 28 Mar 02:30 (UTC+1),
Sun 29 Mar 03:00 (UTC+2) marked "Moved", and Mon 30 Mar 02:30 (UTC+2). On 29 March the clocks
jump from 02:00 to 03:00, so 02:30 does not exist that night.
Day of month or day of week: the OR rule
When one of the two day fields starts with * (a plain *, or a step
such as */2), classic cron requires both fields to match; with a plain
* that simply means the other field decides. When both are restricted, a day
runs if it matches either of them. 0 0 1 * 1 therefore runs on the 1st
of every month and on every Monday, not only on Mondays that fall on the 1st. Cron cannot say
"the first Monday of the month" on its own; the usual workaround is 0 0 1-7 * *
plus a check in the command that today is a Monday. This is the behaviour of Vixie cron, used on most Linux
systems.
Daylight saving time and time zones
Cron follows the wall clock of the machine it runs on. Many servers use UTC, which has no clock changes, so set "Cron runs in" to match the server, not your own computer. In a zone with daylight saving time, Vixie cron and the daemons derived from it treat the two change nights as follows, and the tool shows the same:
- Clocks jump forward: a fixed-time job (neither the minute nor the hour
field starts with
*) whose time is skipped runs right after the jump. A job with*in the minute or hour field follows the new clock, so its skipped times do not run. - Clocks go back: a fixed-time job runs only the first time its time
appears; a job with
*in the minute or hour field runs again in the repeated hour. - Jumps of 3 hours or more are not caught up.
Affected rows are marked "Moved" or "Repeated". Other schedulers may handle these nights differently; if the exact number of runs matters, avoid 01:00–03:00 local time or use UTC.
Common mistakes
* 9 * * *runs 60 times, every minute from 09:00 to 09:59. For one run at 09:00 write0 9 * * *.- Six fields: some job schedulers put seconds first, as in
0 */5 * * * *. Standard cron has no seconds field; the tool offers the five-field version. - Expecting a range to wrap around midnight:
22-2is an error, write22-23,0-2.
Frequently asked questions
How do I run a job every 5 minutes?
Use */5 * * * *. It runs at minutes 0, 5, 10 and so on up to 55 of every hour,
aligned to the clock, not to the moment you saved the crontab.
How do I run a job on the last day of the month?
Standard cron has no "last day" value. Run on days 28 to 31 and let the command check that
tomorrow is the 1st, for example with GNU date:
0 23 28-31 * * [ "$(date -d tomorrow +\%d)" = 01 ] && your-command.
Does cron support seconds?
No. The smallest unit is one minute.
Which time zone does cron use?
The local time of the machine, normally the system time zone. Some cron versions also accept
a CRON_TZ= line that sets the zone for one crontab. Run date on the
server to see its zone.
Is anything I type sent to a server?
No. Parsing and the run-time calculation happen in your browser. The expression and your settings are saved only in this browser's local storage, and nothing is uploaded.
Related tools
- Regex Tester — test regular expressions live, with highlighted matches and capture groups.
- JSON Formatter — validate, format and minify JSON.
- CSV to JSON Converter — convert CSV to JSON and JSON to CSV.
- Subnet Calculator — network, broadcast and host range of any IPv4 subnet.
- Two's Complement Calculator — signed integers in binary, from 2 to 64 bits.