Cron Expression Generator

A cron generator with plain-English output, common recipes, and the field-count differences for Quartz, Spring and AWS that break copied expressions.

Free No Signup Required Browser-Based
Standard Cron Expression
* * * * *
Executes every minute, every hour, every day of the month, every month, every day of the week.

What Cron Expression Generator Does

A cron expression is a compact schedule. Standard Unix cron uses five fields — minute, hour, day of month, month, day of week — and a job runs whenever the current time matches all of them.

Two things trip people up. The first is that Quartz, Spring and several Java schedulers use six or seven fields, adding seconds at the front and sometimes a year at the end, so an expression copied between them is silently off by one position. The second is the day-of-month and day-of-week rule, which is an OR rather than an AND — and that is genuinely counter-intuitive.

This generator builds and explains standard five-field cron expressions. If your scheduler is Quartz or Spring, read the field-count table below before copying anything across.

How to Use Cron Expression Generator

  1. Choose a popular cron preset (every 5 min, daily at midnight, etc.) or set custom fields
  2. Modify Minute, Hour, Day, Month, or Weekday fields
  3. Read the human-friendly English schedule description
  4. Click Copy Cron Expression to paste into your crontab or GitHub Actions

The Five Standard Fields

In order. A job runs when the current time matches every field.

PositionFieldAllowed valuesNotes
1Minute0–59
2Hour0–2324-hour clock; 0 is midnight
3Day of month1–31See the OR rule below
4Month1–12 or JAN–DEC
5Day of week0–7 or SUN–SATBoth 0 and 7 mean Sunday

Source: POSIX — crontab (The Open Group Base Specifications)

Field Count by Scheduler — the Copy-Paste Trap

An expression written for one of these will not mean the same thing in another. Check the count before pasting.

SchedulerFieldsStarts withExample: every day at 02:30
Unix / Linux crontab5Minute30 2 * * *
Quartz6 or 7Seconds0 30 2 * * ?
Spring (@Scheduled)6Seconds0 30 2 * * *
AWS EventBridge6Minute (year at end)30 2 * * ? *
Kubernetes CronJob5Minute30 2 * * *

Common Schedules

ExpressionMeaning
*/5 * * * *Every 5 minutes
0 * * * *Every hour, on the hour
0 2 * * *Every day at 02:00
0 9 * * 1-5Weekdays at 09:00
0 0 1 * *First day of every month at midnight
0 0 * * 0Every Sunday at midnight
*/15 9-17 * * 1-5Every 15 minutes, 9am–5pm, weekdays
0 0 1 1 *Once a year, 1 January

Syntax Elements

SymbolMeansExample
*Every value* * * * * — every minute
,List0,30 * * * * — on the hour and half past
-Range0 9-17 * * * — hourly from 9 to 17
/Step*/10 * * * * — every 10 minutes
@dailyShorthandEquivalent to 0 0 * * *
@rebootAt startupNot supported by every implementation

How to Read Your Result

Day-of-month and day-of-week are ORed, not ANDed

This is the rule that surprises almost everyone. POSIX states that if both the day-of-month and the day-of-week fields are restricted, a job runs when *either* matches. So `0 0 13 * 5` does not mean "Friday the 13th" — it means the 13th of every month AND every Friday. To get Friday the 13th you must restrict one field and test the other inside the command itself.

Check which timezone the scheduler uses

Cron normally runs in the server's local timezone, which means daylight saving transitions cause jobs to be skipped or run twice each year. Many managed schedulers default to UTC instead. A job scheduled for 02:30 local time may not run at all on the spring-forward night. Where it matters, schedule in UTC or avoid the 01:00–03:00 window.

Steps do not mean "every N from now"

*/20 in the minute field fires at :00, :20 and :40 — it steps from the start of the range, not from when you installed the job. And a step that does not divide evenly produces uneven gaps: */7 fires at 0, 7, 14, 21, 28, 35, 42, 49, 56 and then waits only 4 minutes before 0 again.

Cron does not guarantee a run

If the machine is off, or the previous run is still going, standard cron simply skips or overlaps depending on the implementation. It has no retry, no catch-up and no concurrency control. Anything that must not overlap needs its own lock, and anything that must not be missed needs a scheduler with catch-up semantics.

Limitations & Accuracy Notes

  • This generator produces standard five-field expressions. Quartz and Spring six-field formats, and the non-standard L, W and # characters they support, are not generated here.
  • Next-run times are computed in your browser's timezone. Your server may differ, and that difference is a frequent source of "the job ran at the wrong time".
  • Daylight saving behavior varies by implementation. Some run a skipped job immediately after the transition, some do not run it at all, and some run a repeated hour twice.
  • @reboot, @yearly and similar shorthands are conveniences of Vixie cron and derivatives, not POSIX, and are not universally supported.
  • The expression describes when a job is *eligible* to start. It says nothing about whether the machine is awake, whether the previous run finished, or what happens on failure.

Frequently Asked Questions

What do the 5 fields of a standard Cron expression mean?
The standard 5 cron fields represent: Minute (0-59), Hour (0-23), Day of Month (1-31), Month (1-12), and Day of Week (0-6, where 0 is Sunday).
What does */5 mean in a cron expression?
The slash step operator */5 in the minute position means "execute every 5 minutes" (e.g. at minutes 0, 5, 10, 15, etc.).
What do the five fields mean?
In order: minute, hour, day of month, month, and day of week. A standard cron expression has exactly five. Some systems add a sixth leading field for seconds and a few add a trailing year field, which is why an expression copied between platforms sometimes fails.
Is Sunday 0 or 7?
Both, in most implementations — the day-of-week field accepts 0 and 7 for Sunday, with Monday as 1. Names such as SUN and MON are also widely supported but not universal, so numbers are safer if the expression has to be portable.
What happens if I set both day of month and day of week?
This is the single biggest cron gotcha. When both are restricted, standard cron runs the job if either matches, not both — so "1 * * 1" fires on the first of the month and on every Monday. To require both conditions you need a different scheduler or a guard inside the job.
What does the slash mean in a cron expression?
It is a step. */15 in the minute field means every fifteenth minute starting from zero — so at :00, :15, :30 and :45. It does not mean "every 15 minutes from now", which is why a job set to */90 in a 0–59 field never behaves as people expect.
Which time zone does a cron job use?
The server's local time zone unless the scheduler is configured otherwise, which makes daylight saving a real hazard — a job scheduled inside the skipped hour may not run at all in spring, and may run twice in autumn. Scheduling in UTC avoids both.
Why is my cron job not running?
Beyond the expression itself, the usual causes are a different environment — cron runs with a minimal PATH and few environment variables — relative paths that resolve elsewhere, and a script without an executable bit. Redirecting output to a log file is the fastest way to find out which.

References & Further Reading

By OnlineToolHubs Team • September 2026