Skip to content

Cron Expression Generator

Build a cron expression with presets and dropdowns. See the live plain-English description and the next scheduled runs.

Pick a preset or edit each field directly. Output is a standard 5-field cron expression (minute hour day-of-month month day-of-week) — what crontab, GitHub Actions schedules, and most schedulers accept.

Presets

Each field accepts: * any value · , list (e.g. 1,3,5) · - range (e.g. 9-17) · */n step (e.g. */5, or 1-10/3 within a range). Month and weekday also take names (JAN, MON-FRI). If you restrict both day-of-month and day-of-week, cron runs when either matches.

Cron expression

* * * * *

Plain English

Every minute

Next 5 runs

    Cron is the Unix job scheduler. A cron expression is the schedule — five fields, separated by spaces, evaluated every minute by the cron daemon to decide whether to fire each job. The generator above builds the expression from a chosen schedule; this page explains what each field does so you can read and modify the result.

    The five fields

    ┌───────── minute        (0–59)
    │ ┌─────── hour          (0–23)
    │ │ ┌───── day-of-month  (1–31)
    │ │ │ ┌─── month         (1–12 or JAN–DEC)
    │ │ │ │ ┌─ day-of-week   (0–6 or SUN–SAT; some systems also accept 7 = SUN)
    │ │ │ │ │
    * * * * *  command
    

    The cron daemon checks the current time each minute and runs the command if all five fields match. * * * * * matches every minute of every hour of every day, etc.

    Field syntax

    Each field accepts the same set of operators:

    OperatorMeaningExample
    *every value in range* in minute = every minute
    ,list0,15,30,45 = at minutes 0, 15, 30, 45
    -inclusive range9-17 in hour = 9 AM through 5 PM
    /step*/5 in minute = every 5 minutes
    combinedrange with step0-30/10 in minute = at 0, 10, 20, 30

    Common schedules read aloud

    */5 * * * *       every 5 minutes
    0 * * * *         at the top of every hour
    0 0 * * *         at midnight every day
    0 9 * * 1-5       at 9 AM on weekdays
    0 0 1 * *         at midnight on the first of every month
    0 0 * * 0         at midnight on Sunday
    30 2 * * *        at 2:30 AM every day
    0 */6 * * *       every 6 hours
    15,45 * * * *     at :15 and :45 of every hour
    

    If you cannot read a schedule at a glance, paste it into the cron expression parser — it explains the schedule in plain English.

    The day-of-month / day-of-week trap

    The most common cron mistake. When both day-of-month and day-of-week are specified (neither is *), most cron implementations treat them as OR, not AND. So:

    0 0 1 * 1
    

    Reads as “midnight on either the 1st of the month OR every Monday” — not “midnight on the 1st only when the 1st is a Monday.” If you want AND semantics (a specific date that’s also a specific weekday), cron alone can’t express it; you have to script the weekday check inside the job.

    Vixie cron, the dominant Unix implementation, documents this as the OR rule. Some scheduler reimplementations differ — check the docs of the system that’s actually running your jobs.

    Special strings

    Many cron implementations accept these shortcuts in place of the five fields:

    ShortcutEquivalent
    @yearly / @annually0 0 1 1 *
    @monthly0 0 1 * *
    @weekly0 0 * * 0
    @daily / @midnight0 0 * * *
    @hourly0 * * * *
    @rebootonce at daemon startup

    @reboot is the only shortcut that doesn’t map to a five-field expression — it’s a different trigger entirely. Not all schedulers support these (notably some cloud-platform cron-likes don’t), so the explicit five-field form is the more portable choice.

    Timezone

    Cron evaluates against the system clock of the machine running the daemon. A job scheduled 0 9 * * * runs at 9 AM local time on that host. After daylight-saving transitions, the wall-clock time stays consistent, but the UTC offset shifts by an hour — relevant if downstream consumers expect a fixed UTC offset.

    Modern reimplementations (systemd timers, cloud schedulers, Kubernetes CronJobs) often let you specify a timezone explicitly. Classic Unix cron does not.

    Where cron isn’t enough

    • Sub-minute schedules. Cron’s minimum granularity is one minute. Anything finer needs a different scheduler (a daemon, a job queue, a process manager).
    • Once-off scheduling. at is the Unix tool for “run this once at 3 PM tomorrow.” Cron is for recurring jobs.
    • Distributed coordination. If two hosts have the same crontab, both run the job. Use a leader-election lock or a distributed scheduler to fire exactly once across a cluster.
    • Long-running jobs. Cron fires every minute; if a job runs longer than its interval, you’ll get overlapping runs. Wrap with flock or set the job to no-op when its predecessor is still running.

    For specific common schedules, see the dedicated pages: every minute, every 5 minutes, every 15 minutes, every 30 minutes, every hour, daily, weekly, monthly. To reverse the process — read an existing schedule out loud — use the cron expression parser.