Skip to content
DevToolsCave

    This tool runs entirely in your browser. Nothing you paste is uploaded.

    How you can check →

    Cron Expression Generator

    Time & Date

    Build a schedule for Linux, Quartz, Spring, AWS, Kubernetes, Jenkins or GitHub Actions — or paste an expression you found somewhere to see exactly what it runs and when.

    Start from a common schedule

    What this expression does

    Next runs

      Quirks in this dialect

        Build it

        Each field accepts the same syntax as the expression above — edit here or there, they stay in sync.

        In every dialect

        The same schedule, translated. A dialect that cannot express it says why instead of guessing.

        A cron expression generator that knows the dialects disagree

        Cron is not one language. A Linux crontab, a Quartz trigger, a Kubernetes CronJob, an AWS EventBridge rule and a Jenkins build schedule all borrow the same five characters — * * * * * — and disagree about what they mean. This cron expression generator asks which scheduler you're targeting before it answers, builds a real expression for that dialect, and translates it to the other six with every field it cannot express named explicitly rather than approximated.

        The traps this tool is built to catch

        • The day-of-month / day-of-week OR rule. In a standard crontab, restricting both fields at once doesn't mean "both must match" — it means "either matches." 30 4 1,15 * 5 runs on the 1st, the 15th, and every Friday, not just a Friday that happens to fall on those dates. The warnings panel names the actual dates.
        • Weekday numbering shifts by one. POSIX cron numbers Sunday as 0; Quartz and AWS number Sunday as 1. The same digit means a different day depending on the dialect, and it is silent until the job runs on the wrong morning.
        • Field count is ambiguous on its own. A six-field string could be Quartz (seconds first) or AWS (year last) — this tool uses the dialect you picked, and the paste-to-decode path tries every dialect and shows every one that accepts it.
        • Quartz's L, W and # have no Unix equivalent. "Last day of the month," "nearest weekday," and "second Tuesday" are real scheduling needs with no standard crontab spelling — converting to Unix reports the gap and, where one exists, a workaround.
        • Jenkins' H is not a wildcard. It's a hash of the job's name, deliberately unpredictable, used to spread load so a thousand "every 15 minutes" jobs don't all fire on the same tick. This tool shows the window, not a fabricated exact time.
        • DST changes what "every day at 2:30am" means. Some local times don't exist (the clock skips them going forward) and some happen twice (the clock repeats them going back). The next-runs panel marks both rather than picking a plausible-looking instant.

        Seven dialects, one schedule

        Build the expression once and the portability grid shows it in Linux/Unix crontab, Kubernetes CronJob, Quartz (Java), Spring @Scheduled, AWS EventBridge, Jenkins, and GitHub Actions syntax at the same time — with a note wherever something changed meaning (a weekday renumbered) and a stated reason wherever a dialect simply cannot express the schedule you built.

        Common schedules

        Forty schedules people actually search for, with the plain-English reading produced by the same engine that reads the box above — click one to load it into the builder.

        Expression Meaning
        * * * * * Every minute.
        */2 * * * * At minute every 2th starting at every value of every hour.
        */5 * * * * At minute every 5th starting at every value of every hour.
        */10 * * * * At minute every 10th starting at every value of every hour.
        */15 * * * * At minute every 15th starting at every value of every hour.
        */30 * * * * At minute every 30th starting at every value of every hour.
        0 * * * * At minute 0 of every hour.
        0 */2 * * * At minute 0 past every 2th starting at every value.
        0 */3 * * * At minute 0 past every 3th starting at every value.
        0 */4 * * * At minute 0 past every 4th starting at every value.
        0 */6 * * * At minute 0 past every 6th starting at every value.
        0 */12 * * * At minute 0 past every 12th starting at every value.
        0 0 * * * At 00:00.
        0 1 * * * At 01:00.
        0 2 * * * At 02:00.
        0 6 * * * At 06:00.
        0 9 * * * At 09:00.
        0 12 * * * At 12:00.
        0 18 * * * At 18:00.
        0 0,12 * * * At minute 0 past 0 and 12.
        0 8,20 * * * At minute 0 past 8 and 20.
        0 9 * * 1-5 At 09:00, on Monday through Friday.
        0 9 * * 0,6 At 09:00, on Sunday and Saturday.
        0 0 * * 0 At 00:00, on Sunday.
        0 0 * * 1 At 00:00, on Monday.
        0 0 * * 5 At 00:00, on Friday.
        0 17 * * 5 At 17:00, on Friday.
        0 0 1 * * At 00:00, on day 1 of the month.
        0 0 15 * * At 00:00, on day 15 of the month.
        0 0 1,15 * * At 00:00, on day 1 and 15 of the month.
        0 0 28 * * At 00:00, on day 28 of the month.
        0 0 1 1 * At 00:00, on day 1 of the month, in January.
        0 0 1 */3 * At 00:00, on day 1 of the month, in every 3th starting at every value.
        0 0 1 1,4,7,10 * At 00:00, on day 1 of the month, in January, April, July, and October.
        0 0 * * 1-5 At 00:00, on Monday through Friday.
        0 22 * * 1-5 At 22:00, on Monday through Friday.
        30 4 * * * At 04:30.
        0 3 * * 0 At 03:00, on Sunday.
        0 0 29 2 * At 00:00, on day 29 of the month, in February.
        0 0 1 6 * At 00:00, on day 1 of the month, in June.

        Field and character reference

        The special characters beyond *, ,, - and / are largely a Quartz-family privilege — a plain Unix crontab or a Kubernetes CronJob accepts almost none of them.

        Character Meaning Linux / Unix crontabKubernetes CronJobQuartz (Java)Spring @ScheduledAWS EventBridgeJenkinsGitHub Actions
        * every value
        ? no specific value required✓ (= *)required
        L last day of month / last given weekday
        L-n nth-to-last day of month
        W nearest weekday to day n (e.g. 15W)
        # nth weekday of the month (e.g. FRI#2)
        H hashed, per-job spread value (Jenkins)
        Field Range Notes
        Second 0–59 Quartz-family only
        Minute 0–59 every dialect
        Hour 0–23 every dialect, 24-hour
        Day of month 1–31 every dialect
        Month 1–12 (or JAN–DEC where names are supported) every dialect
        Day of week 0–6 or 1–7 numbering differs — see the dialect table above
        Year 1970–2099 (Quartz), 1970–2199 (AWS) Quartz optional; AWS required

        Common use cases

        • Writing a Kubernetes CronJob schedule and checking it against the cluster's timezone
        • Porting a Quartz trigger to a plain crontab, or the reverse, without losing the special characters
        • Working out what an inherited crontab line actually does before touching it
        • Checking an AWS EventBridge cron(...) expression before it goes into a CloudFormation template
        • Confirming a GitHub Actions schedule: won't quietly shift an hour across a DST change
        • Settling an argument about whether a step value like */7 actually divides evenly into the hour

        Everything happens in this tab

        Parsing, translation, linting and the next-run calculation are all computed by JavaScript running in your browser. Nothing you type or paste here — including a crontab line that might contain a real command — is uploaded, logged or stored.

        Frequently asked questions

        Why does the same cron expression mean different things in different tools?
        Because "cron" is a family of similar but incompatible languages, not one standard. A five-field Unix crontab, a six-field Quartz trigger with seconds first, and AWS EventBridge's six fields with the year last all use the same five characters — but disagree on how many fields there are, whether weekdays start at 0 or 1, and what * * * * * even means before you add day restrictions. This tool asks which dialect you mean before it answers.
        What is the day-of-month / day-of-week OR rule?
        In a standard crontab, if both the day-of-month and day-of-week fields are restricted (neither is *), the job runs when EITHER matches — not when both do. So 30 4 1,15 * 5 does not mean "the 1st or 15th, if it's a Friday" — it means "the 1st, the 15th, and every Friday." Quartz and AWS forbid restricting both fields at once for exactly this reason. The warnings panel below names the actual dates this produces for your expression.
        What does H mean in a Jenkins cron schedule?
        H is a hash of the job's own name, not a wildcard. Jenkins uses it to spread load — H/15 runs every 15 minutes, but at a fixed offset that differs per job, so a thousand jobs set to "every 15 minutes" don't all fire on the same tick. Because the exact value depends on the job's name, this tool can show the window an H expression falls in but not a concrete next-run time.
        Can I paste a cron expression instead of building one?
        Yes — the box at the top reads both ways. Paste a bare expression, a full crontab line with a trailing command, an AWS cron(...) wrapper, or a line with a TZ= prefix, and the tool detects which dialects accept it and explains what it does. If more than one dialect parses it the same way, all of them are shown, since picking one silently would be a guess dressed up as an answer.
        Why does converting my expression to another dialect fail?
        Because the target dialect genuinely cannot express it, not because of a bug. Quartz's L (last day of month) has no Unix equivalent; a Unix crontab has no seconds field; AWS requires exactly one of day-of-month or day-of-week to be unspecified. Rather than guess at an approximation, this tool refuses to produce an expression and names the exact field and reason — with a workaround where one exists.
        Does anything I type here get uploaded?
        No. Parsing, translation, the next-run calculation and the DST handling are all done by JavaScript running in your browser. There is no server call, and the receipt below the tool measures that claim rather than asserting it.