Cron is the scheduling language of the Unix world — five small fields that can say "every weekday at 9 AM" or "on the 1st and 15th at midnight" in eleven characters. Build an expression field by field here, or type one in, and this generator validates it, translates it into plain English, and previews the next five times it will fire.
The Five Fields
| Field | Range | Notes | | --- | --- | --- | | Minute | 0–59 | | | Hour | 0–23 | 24-hour clock | | Day of month | 1–31 | | | Month | 1–12 | Numbers only in this tool (no JAN–DEC names) | | Day of week | 0–6 | 0 = Sunday (7 is not accepted here, though some systems allow it) |
Operators: * any value · , list (1,15) · - range (9-17) · / step (*/5 = every 5; 2/6 = every 6 starting at 2). A ? is accepted as a synonym for *, for Quartz-style expressions. Presets cover the classics — every minute, every 5/15 minutes, hourly 0 * * * *, midnight daily 0 0 * * *, weekdays 9 AM 0 9 * * 1-5, weekly Sunday, 1st of month, and Jan 1 yearly.
Worked Examples
0 9 * * 1-5 → the description reads "At minute 0, at 9 AM, Monday through Friday" — the office-hours job. Its next-runs preview (computed in UTC, stepping minute by minute up to a year ahead until five matches are found) tells you the actual upcoming dates, the fastest sanity check in cron: expressions are easy to write and easier to misread, and five concrete timestamps expose mistakes a description can hide.
0 0 1,15 * * → midnight on the 1st and 15th of every month — the billing-cycle job.
*/15 * * * * → every 15 minutes: minute field matches 0, 15, 30, 45.
The Trap This Tool Handles Its Own Way
Classic POSIX cron has a famous rule: when both day-of-month and day-of-week are restricted, the job runs when either matches (OR logic) — so 0 0 1 * 1 fires on the 1st of the month and every Monday. This generator's next-run preview applies AND logic — all five fields must match — so its preview for such expressions shows only days that are both the 1st and a Monday. The validator and several modern schedulers differ on this point; the safe engineering practice, whichever system you deploy to, is to restrict only one of the two day fields (leave the other *), which behaves identically under both logics. Other portability notes: expressions are timezone-less strings — the executing environment's clock decides when "9 AM" is, cloud schedulers often run in UTC or take a separate timezone setting, and this preview is computed in UTC; names (MON, JAN) and extended operators (L, W, #) belong to Quartz and other dialects this tool does not accept — its grammar is the portable POSIX core, validated field by field with range and step checks before a preview is produced.
Frequently Asked Questions
Why does my expression have no next runs?
Two usual causes: an impossible date (day 31 in a 30-day month combined with a restrictive month list, or 30 February) — the preview searches a full year ahead before giving up; or the AND-matching of the day fields described above, where a day-of-month and day-of-week combination simply never co-occurs in the window. Loosen one day field to * and re-check.
What does 0 0 * * 0 run — Saturday or Sunday midnight?
Sunday: day-of-week 0 is Sunday, and hour 0 minute 0 is the very start of the day. The weekly preset uses exactly this expression. If you want Saturday, the field is 6.
Can cron schedule something every 90 minutes, or on the last Friday?
Not in the standard five-field grammar: steps divide their field evenly (90 minutes is not a divisor pattern the minute/hour pair expresses cleanly — workarounds use two expressions), and "last Friday" needs an L-style operator from extended dialects or a script-side date check. The generator stays within the portable standard deliberately, so anything it validates will run on a stock crontab.