Build a 5-field cron schedule visually, explain cron syntax in plain English and preview next run times in your browser.
| Field | Allowed values | Names | Position |
|---|---|---|---|
| Minute | 0–59 | — | 1st |
| Hour | 0–23 | — | 2nd |
| Day of month | 1–31 | — | 3rd |
| Month | 1–12 | JAN–DEC | 4th |
| Day of week | 0–7 (0 and 7 = Sunday) | SUN–SAT | 5th |
A
cron expression
is five space-separated fields that tell a scheduler
when
to run a job:
minute,
hour,
day of month,
month
and
day of week
. A job fires whenever the current time matches all five fields. Each field accepts a single value, a list (
1,15,30
), a range (1-5), a step (*/15) or
*
for “any”.
Use this cron expression generator to build common schedules, explain cron expressions in plain English, and preview next scheduled runs before adding a job to crontab, Kubernetes, GitHub Actions or another 5-field scheduler.
One classic gotcha: when both day-of-month and day-of-week are restricted, most cron implementations treat them as OR — the job runs when either matches, not both. This tool follows that rule when computing the next runs. Cron compatibility still varies between schedulers, especially for seconds fields, year fields and advanced tokens, so confirm production syntax in your target scheduler. Everything is calculated entirely in your browser using your device clock — nothing you build is uploaded.
Type each part into its own field box, or start from a preset and edit. The middle column is the plain-English description the tool shows for that expression.
| Expression | Tool description | What to know |
|---|---|---|
*/15 * * * * |
Every 15 minutes. | Runs at :00, :15, :30 and :45 of every hour. |
0 */6 * * * |
Every 6 hours. | 00:00, 06:00, 12:00 and 18:00 — aligned to the clock, not to when the job was added. |
0 9 * * 1-5 |
At 09:00, on Monday through Friday. | The classic weekday report. 0 9 * * MON-FRI is equivalent. |
30 2 1 * * |
At 02:30, on the 1st of the month. | Monthly maintenance; check daylight-saving rules if 02:30 can be skipped locally. |
*/15 9-17 * * 1-5 |
At minute 0, 15, 30 and 45 past hour 9, 10, 11, 12, 13, 14, 15, 16 and 17, on Monday through Friday. | The last run is 17:45, not 17:00, because hour 17 is included. |
0 18 * * 5-7 |
At 18:00, on Friday through Sunday. |
Both
0
and
7
mean Sunday, so
5-7
runs at 18:00 on Friday, Saturday and Sunday.
|
0 0 1 JAN * |
At 00:00, on the 1st of the month, in January. |
Once a year at midnight on 1 January. Months are numbered 1–12, so
0 0 1 1 *
is the same schedule.
|
20/15 * * * * |
Every 15 minutes from minute 20 through 59. |
Runs at :20, :35 and :50. Classic crontab rejects a step after a single number; write
20-59/15
there.
|
0 0 1,15 * 5 |
At 00:00, on the 1st and 15th of the month, on Friday. | Runs on the 1st, the 15th and every Friday — both day fields are set, so they combine with OR. |
"60" is out of range (0–59) for minute.
0 0 30 2 *
(30 February).
The five fields mean the same thing on these platforms, but the time zone and the surrounding syntax do not.
# crontab -e (per-user crontab)
0 9 * * 1-5 /usr/local/bin/daily-report.sh
Jobs run in the system's time zone unless your cron implementation supports something like
CRON_TZ
(cronie does; check
man 5 crontab). In
/etc/crontab
and
/etc/cron.d/*
a user name goes between the schedule and the command. A
%
in the command is treated as a newline unless escaped as
\%, and cron runs with a minimal environment, so use absolute paths.
spec:
schedule: "0 9 * * 1-5"
timeZone: "Etc/UTC"
Without
.spec.timeZone, the schedule is interpreted in the time zone of the kube-controller-manager. Put
CRON_TZ
or
TZ
in the schedule string and Kubernetes rejects the resource with a validation error — use the
timeZone
field instead.
on:
schedule:
- cron: "30 5 * * 1-5"
Scheduled workflows run in
UTC
by default; GitHub also accepts an optional
timezone
key with an IANA zone name next to
cron
. The shortest interval is every 5 minutes, runs can be delayed when load is high (the start of every hour is busiest), schedules only run from the default branch, and
@daily
-style shortcuts are not supported. In public repositories, scheduled workflows are disabled automatically after 60 days without repository activity.
The preview uses your local time zone, but the scheduler uses its own — often UTC. Convert the intended local time to the scheduler's zone, for example with the Unix Timestamp Converter 's time-zone panel, or set an explicit zone where the platform allows it.
If both day of month and day of week are restricted, a day matches when
either
field matches. To run only on Fridays that fall on the 1st–7th, leave one field as
*
and add the other check in your script.
Steps restart at the beginning of each range.
*/7
in minutes runs at :49 and :56 and then again at :00, only four minutes later;
0 0 */2 * *
runs on odd days of the month, so it fires on the 31st and again on the 1st. Cron cannot express "every 48 hours" exactly.
0 9 * * 1-5
into the Minute box is reported as invalid; use the presets or fill the boxes one by one.
@daily
and Quartz-style tokens
L,
W,
#
and
?
are not accepted. Write the five-field equivalent:
@daily
is
0 0 * * *.
0
and
7
mean Sunday, so
0-7
is every day and
5-7
is Friday through Sunday. Kubernetes CronJobs accept only 0–6, so use
0
or
SUN
for Sunday there.
20/15
, means “from 20 to the end of the field” (minutes 20, 35 and 50), as in Kubernetes and GitHub Actions. Vixie cron and cronie reject this form in crontab; write
20-59/15
to get the same result everywhere.
*. Some implementations, such as Vixie cron and cronie, also treat a field that starts with
*
(for example
*/2) as unrestricted, so a combination like
0 0 1 * */2
can run on fewer days there than the preview shows.
Related: convert run times and epoch values with the Unix Timestamp Converter, and check scheduled-job payloads with the JSON Formatter.
This tool generates standard 5-field Unix/Vixie cron expressions used by crontab, many Linux schedulers, Kubernetes CronJobs, and GitHub Actions. It does not generate Quartz seconds or year fields.
The preview uses your browser local time zone. Real cron jobs run in the scheduler or server time zone, often UTC, so confirm the runtime environment before deploying.
Both. In Vixie cron and cronie, 0 and 7 both mean Sunday, so 0-7 means every day and 5-7 means Friday through Sunday. This tool follows that rule and also accepts the names SUN-SAT. Some schedulers, such as Kubernetes CronJobs, accept only 0-6, so use 0 or SUN when you need portability.
Yes. Cron compatibility varies across Unix crontab, Kubernetes, GitHub Actions, Quartz, cloud schedulers, and application libraries. Check your scheduler documentation before using advanced syntax in production.
No. Parsing, plain-English descriptions and next-run calculations happen client-side in your browser.