Cron Expression Generator & Explainer

Build a crontab schedule without memorising the syntax — or paste an existing expression to see what it means in plain English and exactly when it will run next.

Runs in your browser

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

Common schedules

Build a schedule

On

Next run times

    Edit fields

    0–59
    0–23
    1–31, L
    1–12, JAN–DEC
    0–6, SUN–SAT

    Syntax: * any · 5 value · 1-5 range · 1,15 list · */10 step · 8-18/2 stepped range · macros @hourly @daily @weekly @monthly @yearly.

    Your data never leaves your computer. All processing happens 100% locally in your browser.

    How to use the Cron Expression Generator

    1. Pick a common schedule, or use Build a schedule to choose a frequency, weekdays and time, then click Use this schedule.
    2. Or paste an existing expression such as 30 2 * * 1 into the Cron expression box — the plain-English description updates as you type.
    3. Fine-tune individual parts in Edit fields (minute, hour, day of month, month, day of week).
    4. Check the Next run times list in local time or UTC, then copy the expression into your crontab, CI workflow or scheduler.

    What is a cron expression?

    A cron expression is a compact schedule made of five space-separated fields that tells the Unix cron daemon — and tools built on the same syntax, such as GitHub Actions, GitLab CI, Kubernetes CronJobs, Vercel and many job queues — when to run a task. This generator lets you build an expression from dropdowns, explains any expression in plain English using the open-source cRonstrue library, and calculates the upcoming run times so you can verify a schedule before it goes live.

    The five fields

    ┌──────── minute (0–59)
    │ ┌────── hour (0–23)
    │ │ ┌──── day of month (1–31)
    │ │ │ ┌── month (1–12, JAN–DEC)
    │ │ │ │ ┌ day of week (0–6, SUN–SAT)
    │ │ │ │ │
    * * * * *  command

    In the day-of-week field, 7 also means Sunday.

    Each field accepts * (every value), a single number, a range 1-5, a list 1,15,30, a step */10 or a stepped range 9-17/2. Some schedulers (Quartz, Spring, AWS EventBridge) add a leading seconds field; tick “Seconds field” to work with 6-part expressions.

    Examples

    ExpressionMeaning
    */5 * * * *Every 5 minutes
    0 * * * *At the start of every hour
    30 2 * * *Every day at 02:30
    0 9 * * 1-509:00 on weekdays
    0 0 1 * *Midnight on the 1st of every month
    0 0 1 */3 *Midnight on the first day of each quarter
    15 14 1 * *14:15 on the 1st of every month

    Common mistakes

    • Day of month and day of week. If both fields are restricted, classic cron runs the job when either matches. 0 0 13 * 5 means “every 13th and every Friday”, not “Friday the 13th”. The next-run list follows this rule.
    • Forgetting the minute. * 9 * * * runs 60 times between 09:00 and 09:59. Use 0 9 * * * to run once.
    • Time zones. Cron uses the server's time zone; GitHub Actions and most cloud schedulers use UTC. Switch the run list to UTC to compare.
    • Uneven steps. */45 in the minute field fires at :00 and :45, then :00 again — steps restart each hour, they don't carry over.
    • Quartz day numbers. Quartz counts Sunday as 1, while Unix cron uses 0 (or 7). This tool uses Unix numbering.

    Non-standard extensions

    L in the day-of-month field (last day of the month), 5L (last Friday) and 1#2 (second Monday) are supported by Quartz and some cron implementations but not by Vixie cron on Linux. They are explained and previewed here, but check that your scheduler accepts them. Need to convert a run time to an epoch value? Try the Unix Timestamp Converter or the Time Zone Converter.

    Tools that pair well with the Cron Expression Generator

    • Date Difference Calculator — Count the days between two dates — including business days and a years/months/days breakdown — add or subtract time from a date, or run a live countdown.
    • Regex Tester — Type a pattern and watch matches highlight live in your test text.
    • HTML Formatter — Paste minified or messy markup and get clean, consistently indented HTML — including embedded <style> and <script> blocks.
    • CSS Formatter — Turn a minified stylesheet into readable CSS with one property per line and properly nested @media blocks.

    Frequently asked questions

    What does */15 mean in cron?
    The slash is a step: */15 in the minute field means every 15th minute starting at 0, i.e. :00, :15, :30 and :45. 5-50/15 would give :05, :20, :35 and :50.
    How do I run a cron job every 30 seconds?
    Standard 5-field cron can’t go below one minute. Use a 6-field scheduler that supports seconds (*/30 * * * * *), or add two crontab lines where the second one starts with sleep 30;.
    Is cron time UTC or local?
    Classic cron uses the system time zone of the server (some versions honour a CRON_TZ variable). GitHub Actions, Kubernetes (by default) and most cloud schedulers evaluate expressions in UTC. The run list here can show either.
    What is the difference between @daily and 0 0 * * *?
    None — @daily (or @midnight) is a shorthand for 0 0 * * *. Likewise @hourly = 0 * * * *, @weekly = 0 0 * * 0, @monthly = 0 0 1 * * and @yearly = 0 0 1 1 *.
    How do I schedule a job on the last day of the month?
    Plain Unix cron has no “last day” value. Either use L if your scheduler supports it (0 0 L * *), or run daily on days 28–31 and test the date in the command: 0 0 28-31 * * [ "$(date -d tomorrow +\%d)" = "01" ] && ./job.sh.
    Why does my expression never run?
    Impossible dates such as 0 0 31 2 * (31 February) or 0 0 31 4 * (31 April) never match. The next-run list shows a warning when no run is found in the next ten years.

    Related tools