Skip to main content
ponderloop

Cron Expression Explainer

A cron expression has five fields: minute, hour, day of month, month and day of week. */15 9-17 * * MON-FRI means: Every 15 minutes, between 09:00 and 17:59, on Monday through Friday. Counting from Monday, January 5, 2026 at 08:00 UTC, the first run is Mon, Jan 5, 2026, 09:00 UTC and the tenth is Mon, Jan 5, 2026, 11:15 UTC. Paste your own expression below to get its plain-English meaning and its next 10 run times, in your time zone or in UTC.

Updated Runs in your browser: nothing you enter is uploadedHow this tool works

Five fields: minute hour day-of-month month day-of-week. Or a macro such as @daily.

    Show run times in

    Try an example

    What it means

    Every 15 minutes, between 09:00 and 17:59, on Monday through Friday.

    Next 10 runs

    Counted from Monday, January 5, 2026 at 08:00 UTC, a fixed reference time for this example, and shown in UTC. Once the page loads, the list is recounted from the current time.

    Field by field

    Each field of the expression and what it means
    FieldYou wroteMeaning
    Minute*/15every 15 minutes
    Hour9-17hour 09 through 17
    Day of month*every day of the month
    Month*every month
    Day of weekMON-FRIMonday through Friday

    Common cron expressions in plain English

    The first run is the first one after Monday, January 5, 2026 at 08:00 UTC, the fixed reference time used for the example on this page.
    ExpressionMeaningFirst run after the reference time (UTC)
    * * * * *Every minute, every day.Mon, Jan 5, 2026, 08:01 UTC
    */5 * * * *Every 5 minutes, every day.Mon, Jan 5, 2026, 08:05 UTC
    0 * * * *Every hour, on the hour, every day.Mon, Jan 5, 2026, 09:00 UTC
    0 0 * * *At 00:00, every day.Tue, Jan 6, 2026, 00:00 UTC
    30 8 * * MON-FRIAt 08:30, on Monday through Friday.Mon, Jan 5, 2026, 08:30 UTC
    0 9-17 * * 1-5On the hour, between 09:00 and 17:59, on Monday through Friday.Mon, Jan 5, 2026, 09:00 UTC
    0 0 * * 0At 00:00, on Sunday.Sun, Jan 11, 2026, 00:00 UTC
    0 0 1 * *At 00:00, on the 1st of the month.Sun, Feb 1, 2026, 00:00 UTC
    0 0 1 1 *At 00:00, on the 1st of January.Fri, Jan 1, 2027, 00:00 UTC
    0 0 1,15 * *At 00:00, on the 1st and 15th of the month.Thu, Jan 15, 2026, 00:00 UTC
    */10 * * * *Every 10 minutes, every day.Mon, Jan 5, 2026, 08:10 UTC
    0 */6 * * *At 00:00, 06:00, 12:00 and 18:00, every day.Mon, Jan 5, 2026, 12:00 UTC
    0 22 * * 5At 22:00, on Friday.Fri, Jan 9, 2026, 22:00 UTC
    0 0 1 JAN,APR,JUL,OCT *At 00:00, on the 1st of January, April, July and October.Wed, Apr 1, 2026, 00:00 UTC

    The five fields of a cron expression

    Fields are separated by spaces, in this order. Names are three letters, in any case.
    PositionFieldAllowed valuesNames
    1Minute0–59None
    2Hour0–23None
    3Day of month1–31None
    4Month1–12JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC
    5Day of week0–7 (0 and 7 are both Sunday)SUN, MON, TUE, WED, THU, FRI, SAT

    Cron syntax: star, comma, dash and slash

    Each example is read by this tool.
    SymbolExampleMeaning of the exampleWhat it does
    ** * * * *Every minute, every day.Every value of the field
    ,0,30 * * * *At minutes 0 and 30 past the hour, every day.A list: each value named
    -0 9-17 * * *On the hour, between 09:00 and 17:59, every day.A range: from the first value to the last, inclusive
    /*/15 * * * *Every 15 minutes, every day.A step: every nth value of the range
    /10-40/10 * * * *Every 10 minutes, from minute 10 through 40 past the hour, every day.A step inside a range
    Names0 0 * JAN-MAR MON,FRIAt 00:00, on Monday and Friday in January through March.Month and day names instead of numbers

    Cron macros: @daily, @hourly and the rest

    A macro stands for a five-field expression. @reboot is not listed because it runs at startup, not on a schedule.
    MacroSame asMeaning
    @yearly0 0 1 1 *At 00:00, on the 1st of January.
    @annually0 0 1 1 *At 00:00, on the 1st of January.
    @monthly0 0 1 * *At 00:00, on the 1st of the month.
    @weekly0 0 * * 0At 00:00, on Sunday.
    @daily0 0 * * *At 00:00, every day.
    @midnight0 0 * * *At 00:00, every day.
    @hourly0 * * * *Every hour, on the hour, every day.

    Day of month and day of week together

    When both fields are restricted, a day runs if either one matches. When one is a star, only the other counts. A field that starts with a star, even with a step such as */2, counts as unrestricted, so the two are combined with AND.
    ExpressionDay fieldsMeaning
    0 0 13 * FRIBoth set: either matchesAt 00:00, on the 13th of the month, or on Friday.
    0 0 13 * *One set: it decidesAt 00:00, on the 13th of the month.
    0 0 * * FRIOne set: it decidesAt 00:00, on Friday.
    0 0 */2 * MONStarts with a star: both must matchAt 00:00, on every 2nd day of the month, but only on Monday.

    How to read a cron expression

    1. Paste the expression. Type or paste five fields separated by spaces, such as */15 9-17 * * MON-FRI, or a macro such as @daily.
    2. Read the description. The sentence under the box says when the job runs. Below it, a table reads each field on its own, so you can see which part means what.
    3. Fix any error. If a field is wrong, the message names it and says what is allowed there: for example, that the minute must be 0–59 or that a range cannot run backwards.
    4. Check the next run times. The list shows the next 10 times the job runs, starting from now. Switch between your own time zone and UTC to see them as a server set to UTC would run them.

    Frequently asked questions

    What do the five fields of a cron expression mean?
    From left to right: minute (0–59), hour (0–23), day of month (1–31), month (1–12 or JAN–DEC) and day of week (0–7 or SUN–SAT, where 0 and 7 are both Sunday). A star means every value. For example, */15 9-17 * * MON-FRI reads as: Every 15 minutes, between 09:00 and 17:59, on Monday through Friday.
    What happens when both day of month and day of week are set?
    The job runs when either one matches, not only when both do. This is the POSIX rule, and Vixie cron and cronie follow it. At 00:00, on the 13th of the month, or on Friday: so 0 0 13 * FRI runs on every 13th and on every Friday, not just Friday the 13th. To run only when both match, leave one of the two as a star and test the other condition inside the job (for example, check the weekday in the script).
    Why does */2 in the day-of-month field behave differently?
    Vixie cron and cronie treat a day field as unrestricted when its text starts with a star, even with a step. So 0 0 */2 * MON counts day of month as unrestricted and requires both to match: every second day of the month that is also a Monday. This tool follows that behavior and labels the result so you can see it. The POSIX text only talks about fields given as an element or list, so other cron implementations may differ here.
    Is 7 Sunday in cron?
    Yes. Day of week runs from 0 to 6 with 0 as Sunday, and most crons also accept 7 as Sunday, so 5-7 means Friday through Sunday. The names SUN to SAT work too. A range cannot wrap around, so FRI-MON is an error: write FRI,SAT,SUN,MON or 5-7,1.
    What do @daily, @hourly and the other macros mean?
    @yearly (or @annually) is 0 0 1 1 *, @monthly is 0 0 1 * *, @weekly is 0 0 * * 0, @daily (or @midnight) is 0 0 * * * and @hourly is 0 * * * *. @reboot runs once when the cron daemon starts, so it has no schedule to explain.
    Why does an expression like 0 0 30 2 * say “never runs”?
    February never has a 30th day, so no date matches. The tool searches the next 100 years, skipping whole months and days that cannot match, and says “never runs” when it finds nothing. A schedule on 29 February, by contrast, is valid and runs only in leap years: 0 0 29 2 * runs every four years (except across a century year that is not a leap year, such as 2100).
    Which time zone do the run times use?
    Cron runs jobs in the time zone of the machine (or the CRON_TZ setting in some versions), which on many servers is UTC. The list shows the times in your device’s zone by default and in UTC when you switch. Around a daylight saving change the tool lists a time that the clocks skip as not run and a time they repeat once; real cron daemons handle those hours in slightly different ways, so avoid scheduling jobs between 01:00 and 03:00 local time on a zone that changes.
    Does it support six fields, seconds, L, W, # or ?
    No. This tool reads standard five-field cron as used by crontab. Quartz, Spring and AWS EventBridge expressions have a seconds or year field and extra symbols (?, L, W, #) that standard cron does not have, and the tool says so when it sees them.
    Is anything I paste sent to a server?
    No. The expression is read and the run times are worked out in your browser. The page counts only that the tool was used, never what you typed.

    How it works

    The expression is split on spaces into five fields (or one macro, which is replaced by its five fields). Each field is a comma-separated list of items, and each item is a star, a value or a range with an optional step; month and day names are turned into numbers, and a day of week of 7 is read as 0. The result is the set of values the field matches, and every field with a problem gets its own error message. The star, lists, ranges and the 0 to 6 day-of-week numbers are in POSIX; month and day names, steps, 7 as Sunday and the macros come from Vixie cron and are documented in crontab(5). The either-or day rule is from POSIX: when both day of month and day of week are restricted a day matches if either matches. As in Vixie cron and cronie, a field whose text starts with a star counts as unrestricted. The next run times are found by skipping, not by checking every minute: for a given moment the search moves to the next month in the month set, the next matching day, then the next matching hour and minute, so even a yearly job takes a handful of steps. It stops after 100 years, which is how a schedule that cannot match is reported as never running. The schedule is read on the wall clock of the zone you choose (your device’s zone or UTC), then converted to an instant with the browser’s time zone database. A wall time skipped by a spring-forward change is not run; one repeated in autumn runs once, at its first occurrence. The static example on this page is fixed: its run times are counted from Monday, January 5, 2026 at 08:00 UTC in UTC, so the page looks the same whenever it is built. Once the page loads, the list is counted from the current time.

    Sources

    All toolsHome & DIY calculators