This tool runs entirely in your browser. Nothing you paste is uploaded.
How you can check →Cron Expression Generator
Time & DateBuild 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.
No network activity while you use this tool Show the numbers
- Requests to any other server
- 0
- Requests since you started typing
- —
Counted live by your browser's own Performance Timeline — the same data the DevTools Network panel reads. It cannot see what a browser extension does, and it is not meant to replace checking for yourself: here is how, in thirty seconds .
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 * 5runs 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,Wand#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'
His 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 crontab | Kubernetes CronJob | Quartz (Java) | Spring @Scheduled | AWS EventBridge | Jenkins | GitHub 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
CronJobschedule 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
*/7actually 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.