Five fields, exactly, and no special strings
A cron expression here means exactly five whitespace-separated fields — minute, hour, day of month, month, and day of week — in that order. The parser splits on whitespace and requires precisely five pieces; anything else, including the @daily, @hourly, or @yearly shorthand strings some cron implementations accept, is rejected outright as an invalid expression rather than translated into its five-field equivalent. If you are converting a schedule from a system that uses those shorthands, write out the five fields yourself first.
What each field's syntax actually supports
Every field accepts a wildcard (*, meaning every value), a comma-separated list (1,3,5), a range (1-5), and a step (*/N for every Nth value starting at the field's minimum, or a plain number before the slash for a different starting point, like 0/15). One combination is worth knowing before typing it by hand: writing a range and a step together, like 9-17/2, is accepted without a validation error, but only the range's first number becomes the step's starting point — the upper bound has no effect on where the stepping stops, so the resulting schedule quietly continues past 17 up to the field's real maximum rather than stopping there.
- Minute: 0–59
- Hour: 0–23
- Day of month: 1–31
- Month: 1–12
- Day of week: 0–6 (0 is Sunday)
The plain-language description and the next-run list come from the same parsed fields
Both panels are derived live from whatever five fields are currently set — there is no separate lookup table of known expressions. The plain-language description recognizes specific shapes (every minute, a fixed step with no other constraint, an exact hour and minute) and falls back to a more literal per-field reading for anything less common. The next-run list walks forward one minute at a time from right now, using your browser's own local clock, checking up to 525,600 minutes (one year) ahead, and stops once it has collected five matching timestamps — which is also why an expression that can never match (see below) shows "Unable to calculate next runs" rather than hanging.
Day-of-month and day-of-week: this preview requires both, real crontab usually allows either
This is the field interaction that catches people out, and it is worth stating precisely because this tool behaves differently from most cron daemons on it. On many real cron implementations, when both day-of-month and day-of-week are restricted to something other than *, the job runs when either condition is satisfied — the two are combined with OR. This generator's own next-run preview does the opposite: it requires both to match whenever neither is a wildcard, combining them with AND. An expression like 0 9 1 * 1 (9 AM, the 1st of the month, and Monday) previews here as running only on a 1st-of-the-month that also happens to fall on a Monday — a handful of times a year — not on every Monday plus every 1st the way a real crond would run it. Every other field combination in this tool matches standard cron behavior; this specific one does not, so double-check a day-of-month-and-day-of-week combination against your actual system before relying on this preview for it.
Ten presets, and what the "L" day-of-month button actually does
The Quick Examples panel offers ten complete expressions — every minute, every 5/15/30 minutes, every hour, daily at midnight or noon, every Monday at 9 AM, every weekday at 9 AM, and monthly on the 1st — each of which fills in and re-parses all five fields at once. The day-of-month field's own quick-value row includes an L button labeled "Last day (some systems)," but there is no special handling for L anywhere in this tool's parsing or next-run logic: selecting it produces a day-of-month value the parser cannot turn into a number, so the field simply never matches any real day, and the next-run preview reports it cannot calculate any upcoming runs at all. Some real cron implementations do support L as last-day-of-month; this generator's own preview and description do not compute it, despite offering the button.
One expression traced end to end
Typing 30 9 * * 1-5 produces the plain-language description "At 9:30 AM on Mon through Fri," and the next-run list fills with the next five weekday mornings at 9:30, one per day, skipping weekends automatically because the day-of-week field is a range rather than a wildcard. Changing only the day-of-week field to 1,3,5 instead of 1-5 keeps the same time and switches the description to naming Monday, Wednesday, and Friday individually — the description text always reflects exactly which syntax (range vs. list) was typed, not just which days it resolves to.