Cron Expression Generator

0-59

0-23

1-31

1-12

0-7 (0,7=Sun)

Next

Cron syntax is terse and easy to get wrong: 0 */6 * * * runs every six hours, while */6 0 * * * fires ten times, only during the first hour after midnight. This generator lets you pick a schedule visually (every 15 minutes, weekdays at 9am, the 1st of every month) and outputs the exact expression together with a plain-language description of what it means.

How to build a cron expression

  1. 1

    Pick a preset or type the fields

    Every minute, every hour, daily at midnight, weekly on Sunday and the 1st of every month are one click away. For anything else, type the values directly into the five fields.

  2. 2

    Refine the schedule

    Specific minutes, hours, days of month, months, days of week. Ranges (9-17), lists (1,15) and steps (*/6) all supported.

  3. 3

    Read the expression

    The generator always outputs the standard 5-field cron format, plus a plain-language description of the schedule.

  4. 4

    Check the dialect

    Dialects differ (Quartz, AWS EventBridge, Kubernetes). Confirm the expression matches what your scheduler expects.

The five fields

*  *  *  *  *
│  │  │  │  │
│  │  │  │  └── Day of week (0-6, Sunday=0, or SUN-SAT)
│  │  │  └───── Month (1-12, or JAN-DEC)
│  │  └──────── Day of month (1-31)
│  └─────────── Hour (0-23)
└────────────── Minute (0-59)

Each field accepts:

  • A specific number: 5
  • A list: 1,15,30
  • A range: 9-17
  • A step: */10 (every 10) or 0-30/5 (every 5 from 0 to 30)
  • Wildcard: * (every value)

Common expressions

Schedule Cron expression
Every minute * * * * *
Every 15 minutes */15 * * * *
Every hour on the hour 0 * * * *
Every 6 hours 0 */6 * * *
Every day at 2:30 AM 30 2 * * *
Every weekday at 9 AM 0 9 * * 1-5
Every Monday at 8 AM 0 8 * * 1
First day of every month, 3 AM 0 3 1 * *
Every 15 minutes, 9-17 weekdays */15 9-17 * * 1-5
Noon on the 1st and 15th 0 12 1,15 * *
Every Sunday at midnight 0 0 * * 0

The day-of-month + day-of-week gotcha

In standard cron, if both day-of-month and day-of-week are specified (not *), the job runs when either matches (OR, not AND). 0 0 1 * MON runs on the 1st of every month and on every Monday, not only when the 1st is a Monday.

Vixie cron and most Linux distros follow this OR rule. Quartz (Java) and some others use AND. When in doubt, test the expression with a dry run or a test job in your scheduler.

Dialect differences

  • Standard cron (Linux): 5 fields, day-of-week 0-6 (Sunday = 0 or 7).
  • Quartz (Spring, Java apps): 6-7 fields, with seconds as field 1 and optional year. Day-of-week 1-7 (Sunday = 1).
  • AWS EventBridge cron: 6 fields, with year. Day-of-week and day-of-month must be mutually exclusive (one must be ?).
  • GitHub Actions: standard 5-field, minimum interval 5 minutes, UTC only.
  • Kubernetes CronJob: standard 5-field, UTC by default.

Always confirm which dialect your scheduler uses.

Timezones

Classic cron runs in the server’s local timezone. That bites hard around DST transitions: a 2:30 AM job may run twice or not at all on switch-over days. Modern schedulers (systemd timers, Kubernetes, EventBridge) let you specify the timezone explicitly, use UTC unless you have a good reason not to.

Frequently Asked Questions

Every 5 units of the field, starting from 0. In the minute field */5 fires at minutes 0, 5, 10, 15, …, 55. It is shorthand for 0,5,10,15,20,25,30,35,40,45,50,55.

Cron cannot express arbitrary intervals that do not divide evenly into 60 minutes or 24 hours. For 90 minutes, list the specific fire times: 0 0,9 * * * combined with additional lines, or move to a scheduler that supports arbitrary intervals (systemd timers, anacron).

Midnight. The field order is minute-hour, so 0 0 means “minute 0 of hour 0”. Noon would be 0 12 * * *.

Standard cron skips it, missed runs do not retry. Anacron catches missed daily/weekly/monthly jobs on the next boot. Kubernetes CronJobs have startingDeadlineSeconds and concurrencyPolicy to handle missed windows explicitly.

Related Tools