Skip to content

Cron Expression Builder

Build standard 5-field or Quartz 6-field cron expressions visually, see the next 5 execution times, and read what they actually mean in plain English before deploying.

In your browseryour files never leave your device.

Learn more
Format
* * * * *
Every minute
Next 5 runs
Computed in your browser — local time
  1. 2026-05-18 19:59:00
    in 51 seconds
    today
  2. 2026-05-18 20:00:00
    in 1 minute
    today
  3. 2026-05-18 20:01:00
    in 2 minutes
    today
  4. 2026-05-18 20:02:00
    in 3 minutes
    today
  5. 2026-05-18 20:03:00
    in 4 minutes
    today
Presets (25)⌘Enter validate
*
Minute
*
Hour
*
Day (M)
*
Month
*
Day (W)

About this tool

Cron has used the same five-field syntax since 1975 — minute, hour, day-of-month, month, day-of-week — and people still get it wrong because the rules are subtle. Day-of-week starts on Sunday (0) in most implementations but Monday (1) in some. Both day-of-month and day-of-week active means OR not AND, which trips everyone the first time they hit it. * means every; */5 means every fifth value starting at zero; specific values like 0 9 mean minute 0 of hour 9 (i.e. 9 AM exactly). This builder lets you pick from common presets or set each field via dropdown. As you change anything, the cron string and a plain-English description update together — so before you commit "0 9 * * 1" to a crontab, you read "At 09:00, only on Monday" and confirm that is what you wanted.

How to cron expression builder

  1. Pick a preset or start fresh

    Common schedules are one click away — every minute, hourly, daily midnight, Monday 9 AM, monthly. Or set each field manually if your schedule is unusual. The defaults are all "every" (*) which means the job runs every minute, which is rarely what you actually want but is a clean starting point.

  2. Adjust the fields

    Minute, hour, day-of-month, month, day-of-week. Each has a dropdown of sensible options plus the option to type a value directly. Common values: minute can be 0 (top of the hour), */5 (every 5 minutes), or specific minute. Hour can be a specific 0-23 value or */N for "every N hours". Day-of-week supports ranges (1-5 for Mon-Fri) and lists (0,6 for weekends).

  3. Read the description

    Plain English explains when the job runs. "At 09:00 on Monday through Friday" is much harder to misread than 0 9 * * 1-5. If the description does not match your intent, fix the fields before you commit.

  4. Copy the expression

    One-click copy. Paste into crontab, .github/workflows/*.yml under "schedule.cron", a Kubernetes CronJob spec's spec.schedule, an AWS EventBridge rule expression, or your scheduler of choice. The expression is the same everywhere.

Why use this tool

GitHub Actions schedules are written in cron and run in UTC. The first time you set up "every weekday at 9am London time" you realize that depends on whether the UK is on BST or GMT, so the description in this tool reads "At 09:00, on Monday, Tuesday, Wednesday, Thursday, Friday" and you set the UTC offset yourself based on when you actually want the job to run. The second case is fixing a misfiring cron in a production server. You SSH in, crontab -l, see "30 2 * * 0" and a vague memory tells you that runs Sunday at 2:30 AM but the alert came in on Wednesday. Pasting the expression into a builder confirms the schedule and exposes the off-by-one. The third case is Kubernetes CronJobs, AWS EventBridge schedule rules, GCP Cloud Scheduler, Cloudflare Workers cron triggers, Vercel cron jobs — all use the same 5-field syntax with minor variations. This builder works for every one of them. The fourth is teaching cron to a new team member: showing them visually what 0 0 1 * * means (midnight on the 1st of every month) is much faster than walking through the field-by-field syntax.

Features

Visual field-by-field editing

Dropdowns for minute, hour, day-of-month, month, and day-of-week. Each dropdown shows human-readable options ("Every 15 min", "Mon-Fri", "January") next to the cron syntax they generate. The 5-field expression updates as you change any field, and the dropdowns update if you type the expression directly — so you can work from either end.

Plain-English description

Below the cron expression, a sentence describes when the job will run: "At 09:00, on Monday." This catches the off-by-one mistakes that cause a job to run 6 hours late, or run every day instead of weekly, before they become a 3 AM PagerDuty alert. The description is generated from the expression, not from the dropdowns, so it correctly describes anything you paste in — including expressions someone else wrote.

Next 5 run times computed live

Below the description, the tool computes the next 5 execution times in your local timezone using cron-parser — the same library most Node.js cron schedulers use. Each row shows the absolute datetime ("2026-05-19 09:00:00"), a relative hint ("in 18 hours", "tomorrow", "in 3 days"), and a small chip marking whether the run is today, this week, or further out. The list updates instantly as you edit the expression. Toggle "Show 10" if 5 is not enough to confirm a long cadence. This is the fastest way to catch an expression that looks right but actually fires every day instead of every Monday — you see the dates with your own eyes before deploying.

Preset shortcuts

One-click presets for the schedules everyone actually uses: every minute, every hour, daily at midnight, Monday 9 AM, monthly on the 1st. Clicking a preset fills both the expression and all the field dropdowns so you can fine-tune from there. These five cover maybe 70% of all cron expressions in the wild; the rest are slight variations on these.

Two-way editing

Type the cron expression directly into the text input and the dropdowns update to match; click dropdowns and the expression updates. Useful when you have an expression from somewhere else and want to verify it (paste, read the description), or when you want to make a small tweak (change "every Monday" to "every Monday and Thursday") without retyping the whole thing.

Privacy & security

This tool runs entirely in your browser. Your files are never uploaded to a server — every step of the process (reading, transforming, downloading) happens on your device using JavaScript and the Web APIs. You can verify this in your browser's network tab: clicking the tool's main action triggers zero requests to our servers. The page itself is served over HTTPS, but once it loads, your data stays put. No accounts, no tracking of file contents, no scanning your inputs.

Frequently asked questions

Standard 5-field cron or 6-field (with seconds)?
5-field — minute, hour, day-of-month, month, day-of-week. The Unix vixie-cron format and what GitHub Actions, Kubernetes, AWS EventBridge, and most other schedulers use. The 6-field format (with a leading seconds field) is Quartz Scheduler syntax, common in Spring Boot and some Java schedulers. This tool supports both — toggle between Unix and Quartz at the top, and the field editors, presets, validation, and next-runs panel all adapt. Cron does not have sub-minute resolution natively; for second-level scheduling, you usually want a different scheduler entirely.
Can I see when my cron will actually run?
Yes — the tool computes the next 5 execution times for any valid expression and shows them right under the plain-English description. Each row shows the absolute date in your local timezone (formatted as "YYYY-MM-DD HH:MM:SS") and a relative hint like "in 18 hours" or "tomorrow." Click "Show 10" to see more runs if 5 is not enough to confirm the cadence. The computation runs in your browser via cron-parser — no server roundtrip, no data leaves the page. If the expression is invalid or describes a moment that never fires (like February 30), the panel disappears and the validation toast explains why. This is the single fastest way to verify that "0 0 * * 1" really means what you think before you commit it to a crontab or a CI workflow.
Day-of-week starts at 0 (Sunday) or 1 (Monday)?
Both conventions exist and which one your scheduler uses depends on the implementation. Vixie cron (Linux crontab, most cloud schedulers) uses 0 = Sunday, 6 = Saturday, with 7 also accepted as Sunday for compatibility. ISO 8601 starts on Monday = 1. This builder uses the Vixie convention (Sunday = 0) because that is what most cloud schedulers accept. Always check your scheduler's docs to confirm — getting this wrong off by one day is a classic cron gotcha.
What happens when day-of-month and day-of-week are both specified?
They OR together, not AND. So "0 0 15 * 1" means "at midnight on the 15th of any month OR on any Monday" — not "the 15th, only if it falls on a Monday." This is genuinely counterintuitive and causes more cron bugs than any other rule. If you want AND, you have to use the same field for both or accept the broader schedule. The workaround is to leave one field as * and handle the constraint in your job code.
Where can I use a 5-field cron expression?
Linux crontab (the original), GitHub Actions (with the caveat that GitHub queues jobs at peak times and may delay them by minutes), GitLab CI scheduled pipelines, AWS EventBridge schedule rules (which support both cron and rate expressions), Google Cloud Scheduler, Azure Logic Apps recurring triggers, Kubernetes CronJobs (with seconds-accurate scheduling in newer versions), Vercel cron jobs, Cloudflare Workers cron triggers, Docker Compose with a cron sidecar, ofelia for Docker, Airflow DAG schedules, and most CI/CD tools. The syntax is universal across the ecosystem.
What does */5 mean?
Every fifth value starting from 0. In the minute field, */5 means minute 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55 — twelve runs per hour. */15 in the minute field is "0, 15, 30, 45" — four times an hour. Not the same as "every 5 minutes from now" — it always aligns to multiples of 5 from minute 0. So if your job starts at 8:03 AM and you write */5, it does not run at 8:08, 8:13, 8:18 — it runs at 8:05, 8:10, 8:15.
How do I run a job every 90 minutes?
Cron does not have a clean way to do "every 90 minutes" because 90 does not divide evenly into 60 or 24. The workaround is two expressions: one at 0,30 in the minutes column for even hours (0 0,30 0,3,6,9,12,15,18,21 * * *), another at... you can see this gets ugly fast. Or simulate it with a sleep-based approach inside the job (run every hour but exit early on alternate runs). Or move to a scheduler with interval-based scheduling (every X duration) like systemd timers or Airflow with timedelta intervals.
What about the @yearly, @monthly, @daily shortcuts?
These are alias shortcuts vixie-cron accepts: @yearly is "0 0 1 1 *" (midnight on January 1), @monthly is "0 0 1 * *" (midnight on the 1st), @daily / @midnight is "0 0 * * *", @hourly is "0 * * * *", @reboot is "run once at boot". Most cloud schedulers do not accept the @-aliases — they want the explicit 5-field expression. This builder always emits the full expression so it works everywhere. Translate the aliases yourself if you encounter them in someone else's config.
What time zone does my cron job run in?
Depends on the scheduler. Linux crontab uses the server's system time zone, which means a cron set up on a server in UTC fires at different wall-clock times than one in PST. GitHub Actions, AWS EventBridge, and most cloud schedulers use UTC unless explicitly told otherwise. Kubernetes CronJob has a spec.timeZone field (added in Kubernetes 1.27). Always check your scheduler's docs — "every weekday at 9 AM" in UTC is not the same as 9 AM in London or 9 AM in San Francisco, and DST transitions can mess with the wall-clock interpretation twice a year.
What if my cron job takes longer than the schedule interval?
Most cron implementations do not prevent overlapping runs by default. If your "every 5 minutes" job takes 7 minutes, you will have two copies running simultaneously, which can cause race conditions, duplicate work, or resource exhaustion. The fix is either to make the job idempotent and tolerate overlap, or to add a lockfile / lock row in the database / leader election that prevents concurrent runs. Some modern schedulers (Kubernetes CronJob with concurrencyPolicy: Forbid) handle this for you.