⏱️ Cron Expression Generator
Build cron expressions visually — choose a schedule for each field, then copy the result.
Quick Presets
Matches every valid value in this field. Generates *.
Every
→
⚠Select at least one value.
From
to
→
⚠Start must be ≤ end.
From
to
every
→
Current value:
Import Existing Expression
Paste any 5-field cron expression — or a special string like
@daily, @hourly,
@weekly, @monthly — to load it into the builder.
⚠
Cron Expression Reference
Field Structure
┌───────── minute (0–59)
│ ┌─────── hour (0–23)
│ │ ┌───── day of month (1–31)
│ │ │ ┌─── month (1–12)
│ │ │ │ ┌─ day of week (0–6, Sun=0)
│ │ │ │ │
* * * * *
│ ┌─────── hour (0–23)
│ │ ┌───── day of month (1–31)
│ │ │ ┌─── month (1–12)
│ │ │ │ ┌─ day of week (0–6, Sun=0)
│ │ │ │ │
* * * * *
Special Characters
| Symbol | Meaning | Example | Result |
|---|---|---|---|
* |
Every value | * * * * * |
Every minute |
, |
List of values | 0,30 * * * * |
At :00 and :30 |
- |
Range | * 9-17 * * * |
Every minute, 9 AM–5 PM |
/ |
Step | */15 * * * * |
Every 15 minutes |
*/N |
Every N units | 0 */6 * * * |
Every 6 hours |
N-M/S |
Range with step | 0 8-18/2 * * * |
Every 2 hours, 8 AM–6 PM |
Special Strings (supported by most cron daemons)
The five fields and the four syntax characters
A cron expression is five space-separated fields read left to right: minute 0 to 59, hour 0 to 23, day of month 1 to 31, month 1 to 12, and day of week 0 to 6. The generator colour-codes each field and lets you set it independently, offering the five modes that cover almost every schedule.
Four characters carry the syntax. An asterisk means every value of that field. A comma separates a list, so 6,18 in the hour field means six in the morning and six in the evening. A hyphen forms an inclusive range, so 1-5 in the day of week field covers Monday to Friday. A forward slash adds a step, so a step of 15 on the minute field produces an expression that fires at minutes 0, 15, 30 and 45. A range with a step combines the last two, giving patterns such as every ten minutes between nine and five.
The job runs whenever the current time matches all five fields at once, checked at the start of every minute.
Four characters carry the syntax. An asterisk means every value of that field. A comma separates a list, so 6,18 in the hour field means six in the morning and six in the evening. A hyphen forms an inclusive range, so 1-5 in the day of week field covers Monday to Friday. A forward slash adds a step, so a step of 15 on the minute field produces an expression that fires at minutes 0, 15, 30 and 45. A range with a step combines the last two, giving patterns such as every ten minutes between nine and five.
The job runs whenever the current time matches all five fields at once, checked at the start of every minute.
Building a weekday nine o'clock backup
Say you want a backup to run at nine in the morning on working days only.
The minute field must pin the job to the top of the hour, so choose a specific value of 0. Leaving it as an asterisk would instead fire the job sixty times, once every minute of the nine o'clock hour. The hour field takes a specific value of 9. Day of month and month both stay as every value, written as asterisks, because the schedule is driven by weekday rather than by date. The day of week field takes a range from 1 to 5, since 1 is Monday and 5 is Friday.
Reading the fields together gives 0 9 * * 1-5, described in plain English as nine in the morning, Monday to Friday. That comes to 5 runs a week, or 260 in a normal year.
Change only the minute field to a step of 10 and a range of 9 to 17 on the hour, and you get */10 9-17 * * 1-5, which fires 6 times an hour across 9 hours, or 54 runs each working day.
The minute field must pin the job to the top of the hour, so choose a specific value of 0. Leaving it as an asterisk would instead fire the job sixty times, once every minute of the nine o'clock hour. The hour field takes a specific value of 9. Day of month and month both stay as every value, written as asterisks, because the schedule is driven by weekday rather than by date. The day of week field takes a range from 1 to 5, since 1 is Monday and 5 is Friday.
Reading the fields together gives 0 9 * * 1-5, described in plain English as nine in the morning, Monday to Friday. That comes to 5 runs a week, or 260 in a normal year.
Change only the minute field to a step of 10 and a range of 9 to 17 on the hour, and you get */10 9-17 * * 1-5, which fires 6 times an hour across 9 hours, or 54 runs each working day.
Timezones, the day-of-week trap and other gotchas
The expression says nothing about which clock it is read against. Cron uses the timezone of the machine or the scheduler running it, so a job written for nine in the morning fires at nine UTC on a UTC server even if you wrote it while sitting in London in summer. Check your scheduler's timezone setting before assuming a local time.
The classic trap involves the day of month and day of week fields. When both are set to something other than an asterisk, standard cron treats them as an OR rather than an AND, so 0 9 1 * 1 fires on the first of the month and on every Monday, not only on a Monday that falls on the first. Keep one of the two as an asterisk unless you genuinely want that behaviour.
Two more points. This is the five-field form, so the smallest interval is one minute and there is no seconds field, although some schedulers add one. And a run that overlaps the next scheduled time can leave two copies running at once unless your job guards against it.
The classic trap involves the day of month and day of week fields. When both are set to something other than an asterisk, standard cron treats them as an OR rather than an AND, so 0 9 1 * 1 fires on the first of the month and on every Monday, not only on a Monday that falls on the first. Keep one of the two as an asterisk unless you genuinely want that behaviour.
Two more points. This is the five-field form, so the smallest interval is one minute and there is no seconds field, although some schedulers add one. And a run that overlaps the next scheduled time can leave two copies running at once unless your job guards against it.
Frequently Asked Questions
It runs the job every fifteen minutes, at minutes 0, 15, 30 and 45 of every hour, on every day. The slash introduces a step within the minute field, and the four asterisks that follow mean every hour, every day of month, every month and every day of week are matched.
This generator uses 0 through 6 with 0 as Sunday and 6 as Saturday, which is the most widely supported convention. Some cron implementations also accept 7 as an alternative for Sunday, and many accept three-letter names. If you are targeting a specific scheduler, confirm against its own documentation.
Yes. Use the import option to load an existing expression, and the generator populates the five field controls and shows the plain English description. This is the quickest way to work out what an inherited schedule does before you change it, and it highlights mistakes in the original string.
Whichever timezone the scheduler itself is configured with, which is commonly UTC on servers and containers. The expression carries no timezone information. If your job must run at a particular local time, set the timezone on the scheduler or add an offset to the hour field and account for daylight saving changes.
Cron only fires when a real date matches. A day of month of 31 simply never matches in February, April, June, September or November, so the job silently skips those months. For a reliable end-of-month run, schedule on the first of the following month or handle the date logic inside the job.