Cron expressions look like line noise — 0 9 * * 1-5 — but they control when your backups run, when reports generate, and when servers restart. Misread one field and a job runs at the wrong hour for months. A cron expression generator that also explains expressions in plain English removes the guesswork: type any schedule and see exactly what it means, plus the next five times it will run.
This free cron expression generator works both directions. Paste an expression to get a beginner-friendly explanation and upcoming run times in your local timezone, or use the visual builder to assemble a schedule field by field — with presets like “daily at 9 AM” and “weekdays only” to start from. It validates every field and flags mistakes in plain language. No signup, no server calls — everything runs in your browser.
Cron Expression Generator
Explain any cron schedule in plain English — or build one visually.
Fill the five fields below — the expression, explanation, and next runs update live. Use * for "every", */n for steps, 1-5 for ranges, 1,15 for lists, or names like mon, jan.
e.g. *, */15, 30
e.g. *, 9, 9-17
e.g. *, 1, 15
e.g. *, jan, 1-6
e.g. *, mon, 1-5
Next 5 runs (your browser's local timezone):
Times are computed in your browser's local timezone. Note that cron daemons run in the server's timezone, which may differ.
🔒 100% private — everything runs in your browser, nothing is uploaded.
How to Use the Cron Expression Generator
- To explain a schedule: stay on the “Explain a cron” tab, type or paste any 5-field expression, and read the plain-English explanation plus the next five run times.
- Try a preset — every minute, hourly, daily 9 AM, weekly, monthly — to see how common schedules are written.
- To build a schedule: switch to the “Build a cron” tab and fill in the five fields (minute, hour, day of month, month, day of week).
- Use shorthands freely:
*for every,*/15for every 15 units,1-5for ranges,1,15for lists, or names likemonandjan. - Watch the live explanation update as you type — if a field is invalid, this cron expression generator shows a plain-language error pointing at the exact problem.
- Check the next five runs to confirm the schedule does what you intend, then copy the expression into your crontab or scheduler.
- Remember timezones: the preview uses your browser’s timezone; your server may differ.
Features That Set This Tool Apart
- Plain-English explanations:
0 9 * * 1-5becomes “Runs at 9:00 AM every Monday, Tuesday, Wednesday, Thursday, and Friday” — no decoding required. - Next five run times: see actual upcoming dates, not just the abstract pattern, so off-by-one mistakes are obvious.
- Two-way cron expression generator: explainer and visual builder on one page, sharing the same validation engine.
- Beginner-friendly validation: out-of-range values and malformed fields get specific, human-readable errors instead of silent failures.
- Named values supported:
mon,tue,janwork alongside numbers, exactly like real crontabs. - 100% in-browser: nothing is sent anywhere — safe for schedules containing internal hostnames or paths.
Cron Syntax Explained, Field by Field
A standard cron expression has five fields, read left to right: minute (0–59), hour (0–23), day of month (1–31), month (1–12), and day of week (0–6, where both 0 and 7 mean Sunday). The cron daemon checks every minute: when all the time fields match the current time, the command runs. That’s the entire mechanism — everything else is just shorthand for describing sets of values in each field.
The day-of-month and day-of-week fields have a special relationship that trips up beginners: when both are restricted, the job runs when either matches. So 0 0 1 * 5 runs on the 1st of the month and every Friday — not only on Fridays that are the 1st. If you want “the 1st, but only if it’s a Friday,” standard cron can’t express that; you’d gate it inside the script. When only one of the two is restricted, it behaves as you’d expect.
Hours use 24-hour time: 0 14 * * * is 2:00 PM, not 2:00 AM. Months and weekdays accept the first three letters of English names (jan–dec, mon–sun), case-insensitive, which makes expressions like 0 9 * * mon-fri nicely readable. The authoritative reference is the crontab(5) manual page, which documents the exact field semantics your Linux server follows.
The Special Operators: Star, Step, Range, List
Four operators build every schedule. The asterisk (*) means “every possible value” — * * * * * runs every minute. A range (9-17) selects a contiguous span, so 0 9-17 * * * runs at the top of every hour from 9 AM to 5 PM. A list (1,15) picks specific values: 0 0 1,15 * * runs at midnight on the 1st and 15th.
The step operator (/n) is the most useful and most misunderstood. */15 in the minute field means “every 15 minutes” — but technically it means every 15th value starting from the range’s start, i.e. minutes 0, 15, 30, 45. That distinction matters for ranges: 5-55/10 gives minutes 5, 15, 25, 35, 45, 55 — not 5, 15, 25 starting from 5 offset from zero, which happens to be the same here, but 10-30/15 gives 10 and 25, not 15 and 30. Steps count from the range start, not from zero.
Operators compose freely: */5 9-17 * * 1-5 reads as “every 5 minutes, between 9 AM and 5 PM, Monday to Friday” — a complete business-hours schedule in one line. Paste it into this cron expression generator to see the English version and confirm the next runs land when you expect.
Common Cron Mistakes to Avoid
The classic mistake is the day-of-month/day-of-week OR behavior described above — always double-check any expression that restricts both. The second classic is timezone confusion: cron runs in the server’s timezone, not yours. A job set for “9 AM” on a UTC server fires at 2 PM Pakistan time. This cron expression generator previews runs in your browser’s timezone, so convert accordingly before saving the crontab.
Third, remember the environment: cron jobs run with a minimal environment — a sparse PATH, no loaded shell profile, and a different working directory than your interactive shell. Scripts that work perfectly when you run them manually fail under cron because they rely on an alias, an environment variable, or a relative path. Use absolute paths everywhere and set any variables you need at the top of the crontab.
Fourth, overlapping runs: if a job takes longer than its interval, cron will happily start a second copy while the first is still running. For frequent jobs, add locking (a lockfile or flock) so only one instance runs at a time. And finally, silence: cron emails any output to the crontab owner. Either handle that mailbox or redirect output deliberately — a chatty job can flood an inbox overnight.
Cron Expression Generator: Frequently Asked Questions
What is cron syntax, explained simply?
Cron syntax is five fields — minute, hour, day of month, month, day of week — that describe when a scheduled job runs. Each field holds a set of matching values built with stars, ranges, lists, and steps. The job runs whenever the current time matches all five fields. For example, 0 9 * * * means minute 0, hour 9, every day: daily at 9:00 AM.
What does */5 mean in a cron expression?
The */5 step operator means every 5th value starting from the beginning of the range. In the minute field, */5 expands to minutes 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, and 55 — so the job runs every five minutes. In the hour field, */2 means every two hours (0, 2, 4, and so on). Steps always count from the range start, so 10-30/15 gives 10 and 25.
Cron vs systemd timers — which should I use?
Cron is simpler and universal: one line per job, available on virtually every Linux system, ideal for straightforward recurring tasks. Systemd timers offer more control — calendar and monotonic triggers, dependency handling, logging via journald, and protection against overlapping runs — at the cost of more configuration. For simple schedules, cron wins on simplicity; for critical services, timers are more robust.
How do I schedule a job to run twice daily?
Use a list in the hour field: 0 9,18 * * * runs at 9:00 AM and 6:00 PM every day. For intervals instead of fixed times, use a step: 0 */12 * * * runs every 12 hours at minute 0. Paste either expression into this cron expression generator to verify the next run times before adding it to your crontab.
Why didn’t my cron job run?
The usual suspects: a syntax error in the expression, timezone mismatch between you and the server, a minimal cron environment missing PATH entries or variables your script needs, relative paths resolving to the wrong directory, or overlapping runs from a previous still-running instance. Check the cron daemon’s log first, then verify the expression with this tool, then test the command with cron’s minimal environment.
Related Free Tools
- Unix Timestamp Converter — convert epoch time to readable dates and back.
- Date Calculator — find days between dates or add days to a date.
- Online Stopwatch — precise timing with laps, in your browser.
- All Free Tools — browse the complete collection of free online utilities.
Whether you’re decoding a cryptic schedule or building one from scratch, this cron expression generator gives you plain-English explanations, validated fields, and real upcoming run times — free, private, and instant. Paste your expression above and never guess at cron syntax again.