Polyatic Cron Expression Helper

Cron Expression Helper

Translate a cron expression into plain English and preview the next 8 fire times in UTC and local time — live as you type, all in your browser.

Cron expression (minute hour day month weekday)
Or build it visually

Supports *, */step, ranges (1-5), lists (0,30), 3-letter names (MON, JAN) and @ nicknames (@daily, @weekly, @hourly…). Fields: minute 0–59, hour 0–23, day-of-month 1–31, month 1–12, day-of-week 0–7 (0 and 7 = Sunday).

Interpret schedule in

Next 8 fire times

    Runs entirely in your browser. The expression is parsed and every fire time computed on your own device — no network requests, no logging, no analytics. Disconnect from the internet and it still works.

    What a cron expression is

    Cron is the time-based job scheduler that has run background work on Unix systems since the late 1970s, and its terse five-field syntax has since been copied by countless cloud schedulers, CI systems and libraries. A cron expression is a single line of five space-separated fields that answers one question: at which minutes should this job run? The scheduler wakes up every minute, checks each stored expression against the current time, and runs the jobs whose fields all match. Because the check is per-minute, the finest resolution classic cron offers is one minute — there is no "every 30 seconds" in standard five-field cron.

    The five fields, left to right

    The order never changes, and getting it wrong is the most common mistake — 0 9 * * 1-5 is 9am on weekdays, but swap two fields and you get nonsense the parser may still accept.

    • Minute (0–59). Which minute of the hour. 0 is the top of the hour; */15 is 0, 15, 30 and 45.
    • Hour (0–23). A 24-hour clock, so 0 is midnight, 9 is 9am and 18 is 6pm. There is no am/pm.
    • Day of month (1–31). Calendar day. 1 is the first; use 1,15 for the 1st and 15th. Note that 31 simply never matches in a 30-day month — cron does not clamp it.
    • Month (1–12). 1 is January, 12 December; three-letter names like JAN or DEC also work.
    • Day of week (0–7). 0 and 7 are both Sunday, 1 Monday … 6 Saturday; MONSUN work too. 1-5 is the working week.

    The operators: * / - ,

    Every field accepts the same four operators. An asterisk * means "every value". A step */n means "every n-th value" starting from the low end, and it can also follow a range, so 0-30/10 is 0, 10, 20, 30. A range a-b is inclusive on both ends. A list a,b,c enumerates specific values, and the pieces can be mixed: 0,30,45-55/5 is valid. This tool shows the exact set each field expands to in the per-field breakdown, which is the fastest way to confirm a step or range does what you meant.

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

    Here is the rule that surprises almost everyone. When both the day-of-month and day-of-week fields are restricted — neither is * — cron fires when either one matches. It is an OR, not an AND. So 0 0 13 * 5 runs at midnight on every Friday and on the 13th of every month, not only on Friday the 13th. If one of the two fields is *, only the other applies. There is no way in pure five-field cron to say "the 15th, but only if it is a Monday" — you either accept the OR or add a one-line date check inside the job.

    Common schedules reference

    ExpressionMeaning
    * * * * *Every minute
    */5 * * * *Every 5 minutes
    0 * * * *Every hour, on the hour
    0 */2 * * *Every 2 hours
    0 0 * * *Every day at midnight
    30 8 * * *Every day at 08:30
    0 9 * * 1-509:00 on weekdays (Mon–Fri)
    0 0 * * 0Midnight every Sunday
    0 0 1 * *Midnight on the 1st of each month
    0 0 1 1 *Midnight on 1 January (yearly)
    15 10 * * 1,3,510:15 on Mon, Wed and Fri

    Timezones and daylight saving

    A cron expression carries no timezone; it is matched against whatever clock the scheduler runs on. System cron on a Linux box uses that machine's local time, which means daylight-saving transitions can make a job run twice or not at all when the clock jumps — a job scheduled for 02:30 is skipped on the spring-forward night in zones that leap from 02:00 to 03:00. Many managed schedulers sidestep this by running in UTC. Because the correct answer depends entirely on where the job executes, this tool lets you interpret the expression in either UTC or your own local timezone and prints every fire time in both, so you can check it against your server's clock. The relative labels ("in 3 hours") are always measured from your device's current time.

    The @nickname shortcuts

    Vixie cron also accepts a handful of convenience nicknames in place of a full five-field line, and this tool expands each to its canonical form before reading it — so the plain-English description and the next-run preview work for them exactly as they do for a normal expression:

    NicknameExpands toMeaning
    @yearly / @annually0 0 1 1 *Midnight on 1 January
    @monthly0 0 1 * *Midnight on the 1st of each month
    @weekly0 0 * * 0Midnight every Sunday
    @daily / @midnight0 0 * * *Midnight every day
    @hourly0 * * * *The top of every hour

    One nickname is deliberately left without fire times: @reboot runs a job a single time when the cron daemon starts, so it has no recurring schedule to preview — the tool says so plainly rather than inventing times. @reboot is a Vixie-cron feature and is ignored by many managed schedulers.

    Honest limits

    The visual builder covers the shapes almost every real crontab uses — every value, a pick-list of specific values, one range, or a step (*/n or a-b/n) per field. Cron itself allows more: a single field can mix ranges and steps in one list (1-5,10-15 or 0-20/5,30), and names can stand in for numbers. Expressions like that still parse, describe and preview normally when typed; the builder simply says it can't display them rather than guessing, and it never rewrites what you typed.

    This helper implements standard five-field Vixie-style cron: *, */step, ranges, lists, numeric or 3-letter month/day names, and the @ nicknames covered above. It deliberately does not parse the non-portable extensions some systems add — L (last day), W (nearest weekday) and # (nth weekday) from Quartz, or a sixth seconds/year field. Fire times are computed by walking the calendar minute by minute in the chosen timezone using your browser's date engine, so local-time results honour the daylight-saving rules your system knows about; a machine with a wrong clock or an out-of-date timezone database will show the wrong local time even though the schedule is read correctly. If a schedule can never match (for example 0 0 30 2 *, 30 February), the run list will be empty by design.

    Porting a schedule to or from another scheduler? The Cron Dialect Translator is a separate tool built for exactly that job: it also reads Quartz (6/7-field, seconds-first) and AWS EventBridge (trailing-year) expressions, translates between the three dialects, and flags every lossy gotcha — day-of-week numbering, the ? token, dropped seconds and years. This page stays a single-dialect helper for standard Unix cron.

    New to the syntax, or want to understand the fields without reverse-engineering them from examples? Learn more: Cron expressions explained — a worked guide to the five fields and their ranges, the * / range / list / step operators, the day-of-month vs day-of-week OR trap, ten real schedules decoded field by field, and where standard cron ends and Quartz, @reboot and @macro shortcuts begin.