About this tool
A cron expression is five space-separated fields, minute, hour, day of month, month and day of week, that tell a scheduler when to run a job. This cron expression generator builds the expression from a schedule picker or reads one you paste, explains it in plain English and lists its next 5 run times. The run times are worked out in your browser, in your browser's time zone or in UTC.
How to use the cron expression generator
- Pick a schedule type, such as every N minutes, daily or weekly, and fill in the numbers. Choose Custom to type any expression or macro, such as
*/15 9-17 * * 1-5or@daily. - Check the description and the next 5 run times.
- Copy the expression into your crontab (
crontab -e), CI file or scheduler, followed by the command to run.
The five fields of a cron expression
| Position | Field | Allowed values |
|---|---|---|
| 1 | Minute | 0–59 |
| 2 | Hour | 0–23 (24-hour clock) |
| 3 | Day of month | 1–31 |
| 4 | Month | 1–12, or JAN–DEC |
| 5 | Day of week | 0–6 with 0 = Sunday; 7 is also Sunday, or SUN–SAT |
The ranges are from the POSIX crontab specification. Names and 7 for Sunday are extensions documented in the crontab(5) manual for Vixie-derived cron, which this tool accepts.
Special characters: * , - /
*means every value of the field.,makes a list:0 8,12,18 * * *runs at 08:00, 12:00 and 18:00.-makes an inclusive range:1-5in the last field is Monday to Friday./adds a step to*or a range:*/2in the hour field is every two hours, and1-9/2is the same as1,3,5,7,9.
Lists and ranges are POSIX; steps are a Vixie cron extension.
Macros: @reboot, @daily and friends
Vixie-derived cron accepts a macro in place of all five fields. The crontab(5) manual defines them as extensions, not POSIX:
| Macro | Same as |
|---|---|
@reboot | No schedule: runs once when cron starts |
@yearly, @annually | 0 0 1 1 * |
@monthly | 0 0 1 * * |
@weekly | 0 0 * * 0 (Sunday) |
@daily, @midnight | 0 0 * * * |
@hourly | 0 * * * * |
The day-of-month and day-of-week OR rule
When both day fields are restricted, POSIX says a day matches if either field matches. So 30 4 1,15 * 5 runs at 04:30 on the 1st, on the 15th and on every Friday, not only on Fridays that fall on the 1st or 15th. If either field is *, only the other one counts.
Vixie-derived cron adds a twist: the manual notes it only checks whether a field's first character is *. That makes 0 0 */2 * sun run on Sundays that are odd-numbered dates, where POSIX would run it on every Sunday and every odd date. This tool follows the Vixie rule. Some libraries, such as Python's croniter, use plain OR instead.
Crontab every 5 minutes
The expression is */5 * * * *, so a crontab line looks like */5 * * * * /path/to/script.sh. The step counts from the start of the range: minutes 0, 5, 10 … 55, not 5 minutes after you saved the file. A step only gives even gaps if it divides 60: */7 runs at minute 56 and then at minute 0, only 4 minutes later.
Common cron schedules
Each next-run column was computed with croniter, starting from Saturday, October 17, 2026 at 12:00.
| Expression | Runs | Next two runs |
|---|---|---|
*/5 * * * * | Every 5 minutes | Sat Oct 17 12:05; Sat Oct 17 12:10 |
*/15 * * * * | Every 15 minutes | Sat Oct 17 12:15; Sat Oct 17 12:30 |
0 * * * * | Every hour, on the hour | Sat Oct 17 13:00; Sat Oct 17 14:00 |
0 9 * * 1-5 | Weekdays at 09:00 | Mon Oct 19 09:00; Tue Oct 20 09:00 |
*/15 9-17 * * 1-5 | Every 15 minutes from 09:00 to 17:45 on weekdays | Mon Oct 19 09:00; Mon Oct 19 09:15 |
0 8,12,18 * * * | Every day at 08:00, 12:00 and 18:00 | Sat Oct 17 18:00; Sun Oct 18 08:00 |
30 2 * * 0 | Sundays at 02:30 | Sun Oct 18 02:30; Sun Oct 25 02:30 |
Time zones and daylight saving time
A five-field expression has no time zone. The crontab(5) manual says the cron daemon runs in one configured time zone, and setting TZ inside a crontab changes only the environment of the commands, not when they run. Many servers run on UTC, so check before relying on a local hour.
Daylight saving time adds two gaps. Vixie-derived cron, as described in OpenBSD's cron(8) manual, treats changes of less than three hours specially for jobs at fixed times: jobs in a skipped interval run immediately, and jobs in a repeated interval are not run twice. Jobs that run more often than hourly are scheduled normally. The preview above simply leaves out times that do not exist in the chosen zone and lists a repeated clock time once, so switch to UTC to avoid the ambiguity. To convert run times to and from Unix time, use the Timestamp Converter.
Worked example
The generator opens on Every day, at a specific time with hour 9 and minute 0, so it shows 0 9 * * * and the description "At 09:00, every day." Reading the fields: minute 0, hour 9, any day of month, any month, any day of week. If your clock read Saturday, October 17, 2026 at 10:30, today's 09:00 has passed, so the next 5 run times would be:
1. Sun 2026-10-18 09:00 2. Mon 2026-10-19 09:00 3. Tue 2026-10-20 09:00 4. Wed 2026-10-21 09:00 5. Thu 2026-10-22 09:00
Not every scheduler uses five fields
- Quartz (Java) adds a leading seconds field and an optional year, and AWS EventBridge adds a year; both use
?in one of the day fields. - GitHub Actions uses five-field POSIX syntax. Per the workflow syntax docs, schedules run in UTC by default, an optional
timezonetakes an IANA name such asAmerica/New_York, and the shortest interval is once every 5 minutes.
Pasting a five-field expression into a six-field scheduler shifts every value one place, so the minute is read as seconds.
Common mistakes
- Writing
* 9 * * *for "at 9". That runs every minute from 09:00 to 09:59; use0 9 * * *. - Restricting both day fields and expecting AND logic.
- Using
0 0 31 * *for month end. It skips months with fewer than 31 days.
Frequently asked questions
In order: minute (0-59), hour (0-23), day of month (1-31), month (1-12) and day of week (0-6, where 0 is Sunday; most Linux cron versions also accept 7 for Sunday). An asterisk means every value of that field.
It depends entirely on the system running it, not on the cron expression itself — a cron expression has no built-in timezone. Check your server's or platform's configured timezone (many cloud platforms default to UTC) before relying on an exact run time.
Yes, but standard cron uses OR logic when both are restricted: 0 0 1,15 * 5 runs on the 1st, the 15th and every Friday. Vixie-derived cron only treats a field as unrestricted when it starts with *, so */2 in the day-of-month field combines with the weekday as AND. Paste an expression into Custom mode to see its next run times.
Use */5 * * * *, so a crontab line reads */5 * * * * followed by your command. The */5 in the minute field means every fifth minute starting at 0, so the job runs at minutes 0, 5, 10 and so on up to 55, every hour of every day. Change 5 to 10, 15 or 30 for those intervals.
@reboot runs the command once each time the cron daemon starts, which normally means once per boot. It has no clock schedule, so it has no next run time. It is an extension of Vixie-derived cron, along with @hourly, @daily, @weekly, @monthly and @yearly, and is not part of POSIX.
Put the range 1-5 in the fifth field, which is day of week, where 1 is Monday and 5 is Friday. For example, 0 9 * * 1-5 runs at 9:00 every Monday to Friday. The time is interpreted in the time zone of the machine running the job.