Build a cron expression from a visual schedule, paste one in to have it explained in plain English, and preview exactly when it will run. Everything happens locally in your browser.
SCHEDULE
CRON
Quick presets
Cron expression
Choose a schedule to generate your cron expression.
Cron syntax reference
The five fields
The five cron fields, in order, with their ranges
Position
Field
Range
Allowed
1st
Minute
0–59
* , - /
2nd
Hour
0–23
* , - /
3rd
Day of month
1–31
* , - /
4th
Month
1–12 or JAN–DEC
* , - /
5th
Day of week
0–7 or SUN–SAT
* , - /
Operators
*AsteriskEvery value the field allows.
,CommaA list of specific values.
-HyphenAn inclusive range of values.
/SlashA step — every nth value across the range in front of it.
Examples
Common cron expressions, what they mean and what they are used for
Expression
Meaning
Typical use
Every minute.
Smoke tests and queue drains.
Every 5 minutes.
Health checks and short polls.
At the start of every hour.
Hourly aggregation.
At 30 minutes past every hour.
Offset from the busy top of the hour.
Midnight, every day.
Nightly backups.
9 AM, every day.
Daily digest emails.
9 AM on weekdays.
Working-day reports.
9 AM every Monday.
Weekly summaries.
Midnight on the 1st of every month.
Monthly invoicing.
Midnight on 1 January.
Annual rollovers.
Every 10 minutes during office hours on weekdays.
Business-hours syncing.
2 AM every Saturday.
Weekend maintenance.
Midnight on the 1st and the 15th.
Fortnightly payroll runs.
Midnight on the first day of each quarter.
Quarterly reporting.
Everything happens locally in your browser. No data is uploaded or stored — the parser, the validation and the next-run search all run on your device.
What is a cron expression?
A cron expression is a single line of five fields that tells a scheduler when to run something. It is the format the Unix cron daemon has used since the 1970s, and it has outlived nearly everything it was written alongside — CI pipelines, container platforms, managed cloud schedulers and database jobs all still speak it, usually as a bare string inside a YAML manifest with nothing beside it to say what it means.
The fields are, in order: minute, hour, day of month, month and day of week. Each holds either a specific value or an asterisk meaning “every value”. So 0 9 * * 1-5 reads as: at minute 0, of hour 9, on any day of the month, in any month, when the weekday is Monday through Friday.
The five fields, and what each one holds
1┌───────────── minute (0 - 59)2│ ┌─────────── hour (0 - 23)3│ │ ┌───────── day of month (1 - 31)4│ │ │ ┌─────── month (1 - 12)5│ │ │ │ ┌───── day of week (0 - 7, Sunday is 0 or 7)6│ │ │ │ │70 9 * * 1-5 → 9:00 AM, Monday through Friday
A cron job is the expression plus the command it runs. The expression is only the timing half — everything after the fifth field is handed to the shell.
Cron syntax explained
Fields are separated by whitespace and always appear in the same order. There are exactly five of them in standard Unix cron: no seconds, no year. Each field has its own range, and a value outside that range is normally rejected by the crontab itself, so the job never installs.
The five cron fields with their positions, ranges and permitted characters
Field
Position
Range
Allowed
Minute
1st
0–59
* , - /
Hour
2nd
0–23
* , - /
Day of month
3rd
1–31
* , - /
Month
4th
1–12 or JAN–DEC
* , - /
Day of week
5th
0–7 or SUN–SAT
* , - /
Two details in that table are worth pausing on. The day-of-week field runs 0 to 7, not 0 to 6 — both 0 and 7 mean Sunday, a historical convenience that every mainstream implementation kept. And the month and day-of-week fields accept three-letter names, so 0 9 * * MON-FRI is the same schedule as 0 9 * * 1-5.
Names are easier to read but harder to travel with: not every scheduler accepts them, and none accept them in the numeric fields. The generator above always produces numbers for that reason, while the parser accepts either.
Cron special characters
Four operators cover everything standard cron can express. Every schedule you can write is some combination of these, applied per field.
The four cron operators, with an example of each
Symbol
Name
Meaning
Example
*
Asterisk
Every value the field allows.
* * * * * — Every minute of every hour of every day.
,
Comma
A list of specific values.
0 9,17 * * * — At 9 AM and again at 5 PM.
-
Hyphen
An inclusive range of values.
0 9-17 * * * — Every hour from 9 AM through 5 PM.
/
Slash
A step — every nth value across the range in front of it.
*/15 * * * * — Every 15 minutes: at :00, :15, :30 and :45.
How the slash actually works
The step operator is the one most often misread. /n does not mean “every n from now”; it means “every nth value of the range in front of it”. With an asterisk in front, the range is the whole field, so */15 in the minute field gives :00, :15, :30 and :45.
Put a range in front instead and the step counts from the start of that range: 9-17/2 in the hour field gives 9, 11, 13, 15 and 17 — not 10, 12, 14 and 16. A bare value with a step, like 5/10, means “from 5 to the end of the field, every 10”.
What standard cron does not have
You may see L (last), W (nearest weekday), # (nth weekday of the month) and ? (no specific value) in examples online. None of these are part of standard Unix cron — they belong to Quartz. Putting them in a crontab produces an error, not a clever schedule.
How to create a cron expression
Working from the frequency downwards is faster and less error-prone than filling fields left to right.
Decide how often. Every few minutes, hourly, daily, weekly, monthly or yearly. This decides which fields carry a value and which stay as asterisks.
Pick the minute. Every schedule needs one — even an hourly job fires at a specific minute. Avoid 0 if the machine is busy at the top of the hour; there is nothing special about 0.
Pick the hour, on a 24-hour clock, if the job is daily or less frequent. 5 PM is 17.
Restrict the day — but only one of the two day fields. Setting both makes cron OR them together, which is almost never what you mean.
Leave everything else as an asterisk. A field you have no opinion about should not carry a value.
Read it back. Paste the result into the tool above and check the sentence and the next runs against what you intended.
That last step is not a formality. Cron has no dry-run mode and no feedback loop: a wrong expression is silent, and the usual way to discover it is that a report did not arrive.
Common cron expression examples
Most real schedules are one of a couple of dozen shapes. Every expression below is the exact string to paste, and clicking any of them in the reference panel above loads it into the builder.
Common cron expressions, what they mean and what they are typically used for
Expression
Meaning
Typical use
* * * * *
Every minute.
Smoke tests and queue drains.
*/5 * * * *
Every 5 minutes.
Health checks and short polls.
0 * * * *
At the start of every hour.
Hourly aggregation.
30 * * * *
At 30 minutes past every hour.
Offset from the busy top of the hour.
0 0 * * *
Midnight, every day.
Nightly backups.
0 9 * * *
9 AM, every day.
Daily digest emails.
0 9 * * 1-5
9 AM on weekdays.
Working-day reports.
0 9 * * 1
9 AM every Monday.
Weekly summaries.
0 0 1 * *
Midnight on the 1st of every month.
Monthly invoicing.
0 0 1 1 *
Midnight on 1 January.
Annual rollovers.
*/10 9-17 * * 1-5
Every 10 minutes during office hours on weekdays.
Business-hours syncing.
0 2 * * 6
2 AM every Saturday.
Weekend maintenance.
0 0 1,15 * *
Midnight on the 1st and the 15th.
Fortnightly payroll runs.
0 0 1 1,4,7,10 *
Midnight on the first day of each quarter.
Quarterly reporting.
Reading a busier one
Combinations look harder than they are, because each field is still independent. */10 9-17 * * 1-5 is four separate decisions: every tenth minute, between 9 AM and 5 PM, on any date, Monday to Friday. Take it a field at a time and nothing is ambiguous.
One expression, read field by field
1*/10 9-17 * * 1-52 │ │ │ │ └── weekdays, Monday through Friday3 │ │ │ └─────── every month4 │ │ └─────────── every day of the month5 │ └──────────────── the hours 9 through 17 inclusive6 └─────────────────────── every 10th minute: :00 :10 :20 :30 :40 :50
Cron jobs and time zones
A cron expression carries no time zone. It is interpreted against the clock of the machine running the scheduler — which, on most servers and in almost every container image, is UTC.
This is the gap that catches people out. An expression written on a laptop in Mumbai as “9 AM” fires at 9 AM UTC in production, which is 2:30 PM locally. The expression is not wrong; the assumption about whose clock it reads is.
Check the server rather than guessing — timedatectl or date will tell you what zone it is in.
Some implementations honour CRON_TZ=Asia/Kolkata at the top of the crontab, or a TZ variable for a single job. Many managed schedulers have their own zone setting instead.
Scheduling in UTC and converting as you read it — in your head, or in a time zone converter — is the most portable option, and the one least likely to break when the job moves to a different host.
Daylight saving
If the server does observe daylight saving, two windows a year have no clean answer. When the clocks go forward, times like 02:30 do not occur — depending on the implementation the job runs early, late or not at all. When they go back, 02:30 occurs twice, and the job may run twice.
There is no way to write around this in the expression itself. The practical answer is to keep scheduled work out of the 01:00–03:00 window on a machine that changes its clocks, or to run the machine in UTC, which never does. The next-run preview above marks any run that lands in one of these windows rather than silently choosing an interpretation.
Common cron mistakes
Cron fails quietly. Every mistake below produces either no run at all or a schedule that looks close enough to pass review, which is why they keep happening.
Adding a seconds field
Wrong0 0 9 * * *Right0 9 * * *
Standard Unix cron has five fields and no seconds. A six-field expression is Quartz or Spring syntax; pasting it into a crontab shifts every field one place to the left, so this one would try to run in the minute-zero hour of a day-of-month that does not exist.
Setting both day fields expecting AND
Wrong0 0 13 * 5Right0 0 13 * *
When day-of-month and day-of-week are both restricted, cron runs the job when either matches — not both. The left-hand expression fires on the 13th and on every Friday, not on Friday the 13th. Cron cannot express “Friday the 13th” at all; check the date inside the job instead.
Confusing */5 in the hour field
Wrong0 */5 * * *Right0 */6 * * *
Steps count from zero, so */5 in the hour field gives 0, 5, 10, 15 and 20 — and then jumps only four hours to the next midnight. Use a step that divides 24 evenly (2, 3, 4, 6, 8 or 12) if you want an even spacing.
Using 0 for the day of the month
Wrong0 0 0 * *Right0 0 1 * *
Day of month runs from 1 to 31. Zero is out of range, and most cron implementations reject the whole line, so the job never installs.
Scheduling on the 31st
Wrong0 0 31 * *Right0 0 28 * *
The 31st does not exist in seven months of the year, so a “monthly” job on the 31st runs seven times, not twelve. February is worse — the 29th, 30th and 31st are all unreliable. Pick a day that exists in every month.
Assuming the server runs on your clock
Wrong0 9 * * *Right0 9 * * *
The expression is fine; the assumption is not. Cron uses the machine's local time zone, which on most servers is UTC. A 9 AM job set from London runs at 9 AM UTC unless you have set CRON_TZ or the system zone. Check the server rather than guessing.
Relying on @reboot or @daily everywhere
Wrong@dailyRight0 0 * * *
The @-shortcuts are a Vixie cron convenience, not part of POSIX. Container schedulers, managed cron services and some BSD variants do not accept them. The five-field form works everywhere and says the same thing.
Forgetting the % character in the command
Wrong0 0 * * * date +%YRight0 0 * * * date +\%Y
In a crontab, an unescaped % ends the command and everything after it is fed to the job as standard input. Escape it as \% or the command is silently truncated.
Cron vs Quartz cron
Search for a cron expression and roughly half the results will be Quartz — the scheduling library used by Java and Spring applications. The two formats look alike, and they are not interchangeable. A Quartz expression in a Linux crontab is rejected outright if you are lucky, and silently misread if you are not.
Differences between standard Unix cron and Quartz cron expressions
Aspect
Unix cron (this tool)
Quartz
Number of fields
5
6 or 7
Seconds field
Not supported
First field, required
Year field
Not supported
Optional 7th field
Day of week numbering
0–7, Sunday is 0 and 7
1–7, Sunday is 1
Both day fields set
Runs when either matches
One must be ? — both is an error
Extra characters
* , - / only
Also L, W, # and ?
Typically used by
Linux and Unix crontab, most CI schedulers
Quartz, Spring, some Java schedulers
The quickest test is to count the fields. Five is Unix cron. Six or seven is Quartz, and the extra field at the front is seconds — which is why 0 0 9 * * * looks like a 9 AM job and is not one in a crontab, where it shifts every field one place left.
The other trap is the weekday numbering. Unix cron numbers Sunday as 0 (or 7); Quartz numbers it as 1, so every weekday in a Quartz expression is one higher than the same day in Unix cron. Copying MON-FRI across works; copying 2-6 across gives you Tuesday to Saturday.
Frequently asked questions
What is a cron expression?
A cron expression is a line of five fields that tells a scheduler when to run a job: minute, hour, day of month, month and day of week, in that order. `0 9 * * 1-5` means nine in the morning, Monday through Friday. The asterisks mean “every value”, so a field you do not care about is left as one.
How do I write a cron expression?
Start from the frequency and fill in only what you need. Decide the minute, then the hour, then whether it repeats daily, weekly, monthly or yearly, and leave the rest as asterisks. The builder above does this for you and shows the result as you go — pick a schedule on the left and the expression appears on the right, with a sentence explaining exactly what it will do.
What are the five fields in a cron expression?
Minute (0–59), hour (0–23), day of month (1–31), month (1–12) and day of week (0–7). They are always in that order and always separated by spaces. Sunday can be written as either 0 or 7 — both are accepted by standard cron and this tool treats them identically.
What does * mean in cron?
An asterisk means every value the field allows. In the minute field it means all sixty minutes; in the month field it means all twelve months. `* * * * *` is therefore every minute of every hour of every day — the busiest schedule you can write with five fields.
What does */5 mean in cron?
It is a step: every fifth value, counting from the start of the field. In the minute field `*/5` fires at :00, :05, :10 and so on — twelve times an hour. The slash always means “every nth”, and what it steps through is whatever sits in front of it, so `9-17/2` means every second hour between 9 and 17.
How do I run a cron job every 5 minutes?
Use `*/5 * * * *`. That fires at twelve points in every hour, all day, every day. For every 10, 15 or 30 minutes, change the number: `*/10`, `*/15`, `*/30`. Intervals that divide 60 evenly keep the gaps equal; `*/7` would fire at :00, :07 … :56 and then wait only four minutes for the next hour to start.
How do I run a cron job every hour?
Use `0 * * * *` — at minute zero of every hour. Do not use `* * * * *`, which runs every minute, or `0 0 * * *`, which runs once a day at midnight. If you want to avoid the top of the hour, when every other job on the machine is also starting, use a different minute: `17 * * * *` is a perfectly ordinary choice.
How do I run a cron job every day at a specific time?
Put the minute and hour in the first two fields and leave the rest as asterisks. `0 9 * * *` is 9:00 AM daily, `30 17 * * *` is 5:30 PM daily, and `0 0 * * *` is midnight. Remember that the hour field uses a 24-hour clock, so 5 PM is 17.
How do I run a cron job on weekdays only?
Set the day-of-week field to `1-5`, which is Monday through Friday. `0 9 * * 1-5` runs at nine every working day and skips the weekend. For weekends only, use `0,6` — Sunday and Saturday. Leave day of month as an asterisk, or you will trigger cron's OR rule and the job will run on far more days than you intended.
How do I run a cron job on the first day of the month?
Use `0 0 1 * *` — midnight on the 1st, every month. Change the hour and minute for a different time, and the third field for a different day. Avoid days 29 to 31 if the job needs to run every month: the 31st exists in only seven months, so a “monthly” job on the 31st actually runs seven times a year.
What is the difference between day of month and day of week?
They are separate fields and, crucially, they are combined with OR rather than AND. If both are set to something other than an asterisk, the job runs when either matches. `0 0 13 * 5` runs on the 13th of every month *and* on every Friday — not on Friday the 13th. If only one of the two is restricted, only that one applies. This is the single most misunderstood rule in cron, and the tool above flags it whenever your expression triggers it.
Can cron run a job on Friday the 13th?
Not with a cron expression alone. Because the two day fields are OR-ed rather than AND-ed, there is no way to say “the 13th, but only when it is a Friday”. The usual answer is to schedule the job for every 13th with `0 0 13 * *` and have the script itself exit early when the weekday is not Friday.
What time zone does cron use?
The local time zone of the machine the scheduler runs on, which on most servers and in most containers is UTC. That is why a job set for 9 AM from a laptop in London or Mumbai may fire at a quite different local hour in production. Some implementations let you set `CRON_TZ` at the top of the crontab or a `TZ` variable for the job. The next-run preview above lets you pick the zone so you can check both.
What happens to cron jobs during daylight saving time?
It depends on the implementation, and this is one of the few places where there is no single right answer. When the clocks go forward, a time like 02:30 does not exist that day — some versions of cron run the job anyway, some skip it. When the clocks go back, 02:30 happens twice, and some versions run the job twice. Jobs scheduled outside the 01:00–03:00 window are unaffected. The preview above marks any run that lands in one of these windows rather than quietly picking an answer.
How many fields does a cron expression have?
Standard Unix cron has five. If you are looking at six or seven, it is almost certainly a Quartz or Spring expression, which adds a seconds field at the front and an optional year at the end. Pasting a six-field expression into a Linux crontab shifts every field one place and produces a schedule nobody intended — this tool reports that case rather than trying to interpret it.
What is the difference between cron and Quartz cron?
Quartz is a Java scheduling library with its own dialect. It uses six or seven fields rather than five, numbers the days of the week 1–7 with Sunday as 1 rather than 0–7 with Sunday as 0 or 7, requires a `?` in one of the two day fields, and adds `L`, `W` and `#` for things like “last Friday of the month”. The two formats look similar and are not interchangeable. This tool generates standard Unix cron only.
Does this cron generator support seconds?
No, and that is deliberate. Standard Unix cron has no seconds field — the smallest interval it can express is one minute. Tools that offer a seconds field are generating Quartz or a systemd timer, and pasting that output into a crontab produces a broken schedule. If you need sub-minute work, run a job every minute that loops internally, or use a systemd timer or a task queue instead.
What are @daily, @hourly and @reboot?
They are convenience shortcuts that Vixie cron accepts: `@hourly` is `0 * * * *`, `@daily` and `@midnight` are `0 0 * * *`, `@weekly` is `0 0 * * 0`, `@monthly` is `0 0 1 * *`, `@yearly` and `@annually` are `0 0 1 1 *`, and `@reboot` runs once at startup. They are not part of POSIX, and container schedulers and managed cron services often reject them, so this generator emits the five-field form — which means the same thing and works everywhere.
How do I list, edit and remove cron jobs?
`crontab -l` lists the current user's jobs, `crontab -e` opens them in an editor, and `crontab -r` deletes all of them — that last one has no confirmation prompt, so it is worth keeping a copy. System-wide jobs live in `/etc/crontab` and `/etc/cron.d/`, which have an extra field for the user the job runs as.
Why is my cron job not running?
In rough order of likelihood: the expression matches a different time than you think — paste it into the tool above and read the sentence; the server is in a different time zone; the job's environment has a minimal `PATH` and cannot find the command, so absolute paths are safer; the script is not executable; the crontab has no trailing newline, which some versions require; or the command contains an unescaped `%`, which cron treats as end-of-command. Redirecting output to a file with `>> /tmp/job.log 2>&1` usually answers the question in one run.
Can two cron jobs run at the same time?
Yes. Cron starts a job whenever the schedule matches, whether or not the previous run has finished, so a job that takes twelve minutes on a five-minute schedule will end up with three copies running at once. If that is a problem, wrap the command in `flock` — `flock -n /tmp/job.lock command` — which quietly skips a run rather than piling up.
How do I test a cron expression without waiting?
Read it rather than run it. Paste the expression into the tool above: the sentence tells you what it does, the field breakdown shows exactly which values each field matches, and the next-run preview lists the actual dates and times it will fire in the zone you choose. That catches the vast majority of mistakes in seconds, which no amount of waiting for the real thing will.
What is the maximum and minimum frequency for a cron job?
The most frequent is once a minute — `* * * * *` — because minutes are the finest unit the five-field format has. There is no upper limit on the gap: `0 0 1 1 *` runs once a year, and `0 0 29 2 *` runs on 29 February, which means once every four years. The tool above will tell you when an expression can never run at all, such as one scheduled for 30 February.
Is this cron generator free, and is my data sent anywhere?
It is free and nothing leaves your device. The parser, the description, the validation and the next-run search all run in your browser as JavaScript — there is no server call and no analytics on what you type. You can confirm it by opening your browser's network panel, or by disconnecting from the internet: the page carries on working.
Keep going
Tools that pair with this one
Same privacy model — everything below runs in your browser too.