Skip to content
FormatKit

Free cron expression generator

Cron generator that shows the next five runs

This cron expression generator is free and needs no signup: set the minute, hour, day, month and weekday from dropdowns, or paste an expression you already have and read it back as a sentence. It takes the standard five-field crontab syntax, the six-field form with seconds in front, and the @daily family of shortcuts, then shows the next five times the job would fire in whichever of 36 time zones you pick. It also warns about the rule that catches nearly everyone — when both day fields are set, cron runs the job on days matching either one.

  • 100% free
  • No signup
  • 5 and 6 field syntax
  • 36 time zones
  • Next 5 runs
Shortcuts:

At 09:30, on weekdays

Build it field by field

Minute30
Hour9
Day of month*
Month*
Day of weekto1-5

Next five runs

Working out the schedule…

The fields and the symbols

Five fields separated by spaces, read left to right from the smallest unit upwards. The optional sixth field for seconds goes in front of the minute, not after the weekday — putting it at the end is a Quartz year field and means something else entirely.

Cron fields in order with the values each one accepts
PositionFieldAccepts
0 (optional)Second0-59 — only present in the six-field form
1Minute0-59
2Hour0-23, midnight is 0
3Day of month1-31 — a 31 simply never fires in February
4Month1-12 or JAN-DEC, case-insensitive
5Day of week0-7 or SUN-SAT, where both 0 and 7 mean Sunday
Special characters used in cron fields, their meaning, and whether this page implements them
SymbolNameMeaningHere
*WildcardEvery value the field allows.Yes
,ListSeveral values: 1,15,30.Yes
-RangeAn inclusive span: 9-17. It does not wrap past the end of the field.Yes
/StepEvery nth value from the start of the range: */15 or 0-20/2.Yes
?No specific valueA Quartz spelling of * for the two day fields, meaning the other one decides.Read as *
LLastLast day of the month, or the last given weekday: 5L is the final Friday.Rejected — Quartz only
WWeekdayThe nearest weekday to a date: 15W runs on the Friday if the 15th is a Saturday.Rejected — Quartz only
#Nth weekdayThe nth given weekday of the month: 6#3 is the third Saturday.Rejected — Quartz only

Sixteen expressions worth keeping

Paste any of these into the box above to see its next five runs on your own clock. The last one only works where a seconds field is allowed.

Common cron expressions with what each one schedules
ExpressionWhen it runs
*/5 * * * *Every five minutes, on the hour and every five after it.
0 * * * *On the hour, every hour — 24 runs a day.
0 3 * * *03:00 every day, the traditional slot for a backup.
30 9 * * 1-509:30 Monday to Friday, and never at a weekend.
0 0 * * 0Midnight on Sunday — which is what @weekly means.
0 0 1 * *Midnight on the first of each month.
0 0 1 1 *Midnight on New Year's Day, once a year.
15 14 1 * *14:15 on the first of every month.
0 22 * * 1-522:00 on weekday evenings.
23 0-20/2 * * *Minute 23 of every second hour from midnight to 20:00.
5 4 * * sun04:05 on Sundays, written with a name instead of a 0.
0 0,12 1 */2 *Midnight and midday on the 1st of every second month.
0 9-17 * * *On the hour through office hours, nine runs a day.
*/30 9-17 * * 1-5Every half hour during weekday office hours.
0 0 29 2 *Midnight on 29 February — roughly once every four years.
*/15 * * * * *Every fifteen seconds, in the six-field form only.

The shortcuts, and what they expand to

Cron shortcut names with the five-field expression each one is equivalent to
ShortcutEquivalentNotes
@yearly0 0 1 1 *Midnight on 1 January. @annually is the same thing.
@monthly0 0 1 * *Midnight on the first of every month.
@weekly0 0 * * 0Midnight on Sunday, not on Monday.
@daily0 0 * * *Midnight every day. @midnight is the same thing.
@hourly0 * * * *The top of every hour.
@rebootOnce when the daemon starts. It has no schedule, so no next run can be computed.

How to build a cron expression

Pick the fields, read the sentence, confirm the next five runs.

  1. Start from a shortcut or a working expression

    Click @daily, @hourly, @weekly, @monthly or @yearly to load the expression it expands to, or type your own into the box — five fields, or six with seconds in front. Pasting a cron line anywhere on the page drops it straight in, and the sixteen worked examples further down cover most of what a scheduler is ever asked to do.

  2. Adjust one field at a time

    Each row of the builder edits exactly one field and leaves the rest alone. Pick Every, Every N, Range or Specific: numeric fields take a comma-separated list, and the month and weekday rows give you named buttons, so choosing MON, WED and FRI writes MON,WED,FRI rather than making you remember that Sunday is zero.

  3. Check the sentence and the next five runs

    Under the box the expression is restated in English, with a warning whenever the schedule is not what the fields suggest — both day fields restricted, a 31st that skips seven months, a six-field expression crontab would reject. Pick a time zone and the next five firing times appear as local wall-clock time, as a relative distance, and as a UTC instant, including a note when a daylight-saving jump moves one of them.

Technical specifications

Syntax acceptedVixie and POSIX crontab: five fields, or six with seconds first. Seven-field Quartz expressions are rejected rather than guessed at
Special characters* , - / and ? are implemented; the Quartz extensions L, W and # are detected and refused, because a crontab would never run them
Shortcuts6 recognised: @yearly, @annually, @monthly, @weekly, @daily, @midnight, @hourly and @reboot, which has no schedule at all
Field rangesminute 0-59, hour 0-23, day of month 1-31, month 1-12, day of week 0-7, plus names JAN-DEC and SUN-SAT
Next runsFive, computed in any of 36 time zones plus the one your browser reports, walking wall-clock time so a daylight-saving change does not shift the hour
Search horizonTwenty years, so a 29 February schedule still produces five dates; an expression that can never fire, such as 30 February, is reported as impossible rather than left spinning
Validation messagesName the field and the fault: a backwards range, a zero step, a value out of range, the wrong number of fields, a Quartz extension
Processing locationYour browser — the parser and the scheduler are JavaScript in this tab, and no expression is sent anywhere

Frequently asked questions

Does 0 0 * * 1 run on Monday or Sunday?

Monday, in crontab. The day-of-week field counts from 0 for Sunday, so 1 is Monday, 5 is Friday and both 0 and 7 mean Sunday. The trap is that Quartz — used by Spring, Jenkins and Elastic — numbers the same field from 1 for Sunday, which makes 1 mean Sunday and shifts every literal by a day when an expression is copied between the two. Writing MON instead of 1 sidesteps the whole question, and both grammars accept the names.

Why does 0 0 1 * 1 run far more often than once a month?

Because cron ORs the two day fields instead of ANDing them. When both day-of-month and day-of-week are restricted, the job runs on days that match either one — so 0 0 1 * 1 fires on the 1st of every month and on every Monday, about 57 times a year rather than 12. The rule comes from the POSIX specification and is honoured by Vixie cron, so it is not a quirk of any one implementation. If you need the intersection, restrict one field in cron and test the other inside the job: run daily at midnight on Mondays, and exit early unless the date is the 1st.

Which time zone does a cron job use?

Whatever the machine or the scheduler decides, and almost never the one you meant. A classic crontab uses the system time zone unless a CRON_TZ= line appears above the entry; systemd timers take OnCalendar with an explicit zone; a Kubernetes CronJob runs in the controller's zone, which is normally UTC, unless spec.timeZone is set — a field that only became stable in Kubernetes 1.27; and GitHub Actions schedules are UTC with no option to change them. Pick the zone in the panel above to see what your expression actually does on that clock.

What happens to a cron job during a daylight-saving change?

It depends on whether the wall-clock time exists that day. When the clocks go forward, the skipped hour never occurs, and Vixie cron runs jobs scheduled inside it once, immediately after the jump; when they go back, the repeated hour would fire a job twice, and cron suppresses the second occurrence for fixed-time entries. Jobs that run more often than once an hour — anything with a wildcard or a step in the hour field — are left alone entirely and simply follow the clock. The schedule above marks a run whose wall-clock time is skipped, and the safe answer for anything financial is to schedule in UTC.

Is */7 a valid step, and what does it actually do?

It is valid, and it does not mean every seven minutes. A step divides the field's own range from its start, so */7 in the minute field gives 0, 7, 14, 21, 28, 35, 42, 49 and 56 — and then the hour rolls over, putting only four minutes between the last run and the next. The same applies to any step that does not divide the range evenly: */40 fires at minute 0 and minute 40 and nowhere else. Steps that divide 60 cleanly — 2, 3, 4, 5, 6, 10, 12, 15, 20, 30 — are the only ones that produce an even spacing.

What is the difference between five-field and six-field cron?

The sixth field is seconds, and it goes at the front. Standard crontab, Kubernetes CronJobs and GitHub Actions all take exactly five fields — minute, hour, day of month, month, day of week — and reject anything longer. Spring, node-cron, Quartz and several job frameworks accept a leading seconds field, so 0 30 9 * * 1-5 in those systems is 09:30 on weekdays and would be an error in a crontab. Quartz also allows a seventh field for the year. Use the toggle above to add or drop the seconds field and watch the description change; the warning bar tells you when an expression would not be accepted by a plain crontab.

What happens if a job is still running when the next tick arrives?

Cron starts another copy — it tracks schedules, not processes. Two backups writing to one file, or two importers reading one queue, is a failure mode that only appears once the job gets slow in production. The standard fix on Linux is flock, as in flock -n /tmp/job.lock /usr/local/bin/job.sh, which makes the second run exit immediately. Kubernetes has this built in as spec.concurrencyPolicy, where Forbid skips the new run and Replace kills the old one, and it also has startingDeadlineSeconds to control what happens after the controller has been down through a scheduled window.

About cron expressions

The syntax comes from Paul Vixie’s cron, written in 1987 and shipped with almost every Unix since, and it has barely moved because it did not need to: five fields, a few symbols, one line per job. Every scheduler that came afterwards borrowed the grammar rather than invent one — Kubernetes CronJobs, GitHub Actions, Spring, Quartz, systemd timers via a converter, and the “run this every” box in a hundred SaaS products. What they did not borrow consistently is the details, which is why the same five characters can mean two different days depending on where you paste them.

The one behaviour worth committing to memory is the day rule. When day-of-month and day-of-week are both restricted, cron takes the union: the job runs if either matches. It is in the POSIX specification, it dates back to a disagreement between the AT&T and BSD implementations that was settled by keeping both behaviours at once, and it turns 0 0 1 * 1 from a monthly job into a near-weekly one. Restricting only one field is the reliable answer; where you truly need an intersection — the first Monday of the month — cron alone cannot express it, and the check belongs in the first three lines of the job.

Everything else that goes wrong with a schedule is about time rather than syntax. A crontab runs in the machine’s zone, a container usually runs in UTC, and a laptop in between shows a third answer, so a job that looked like 09:30 in review fires at 06:30 in production; the panel above exists to make that discrepancy visible before it ships. Missed windows are the other half: a machine asleep at 03:00 simply skips the run, and Kubernetes gives up entirely if the controller was down for longer than startingDeadlineSeconds. If you are reconciling what a scheduler recorded against what a log says, the epoch converter turns those timestamps into something readable, and the timestamp converter moves them between zones.

Where the schedule is computed

Entirely in your browser. The parser, the description and the next-run search are JavaScript running in this tab, and your expression — which often names an internal job, a customer batch or a maintenance window — is never uploaded, logged or stored.