Build a cron schedule, or decode one
Every crontab line starts with five fields that say when a command runs. 30 3 * * 1-5 reads “At 03:30, Monday through Friday”. This tool works both ways: paste an expression into “Cron expression” and read it under “In plain English”, or put one together with the “Generator”. “Next runs” lists the following 10 dates in any time zone, such as America/New_York.
How to use it
- Type or paste the expression. Mistakes are reported per field, for example “Minute: 60 is out of the allowed range (0 to 59).”
- Or pick a generator tab (“Minutes”, “Hourly”, “Daily”, “Weekly”, “Day of month”, “Months”): the expression updates as you change the settings.
- Check the dates, then use “Copy expression”, or “Copy link” to share the whole setup, time zone included.
The five fields
| Position | Field | Allowed values |
|---|---|---|
| 1 | Minute | 0 to 59 |
| 2 | Hour | 0 to 23 |
| 3 | Day of month | 1 to 31 |
| 4 | Month | 1 to 12 or JAN to DEC |
| 5 | Day of week | 0 to 7 (0 and 7 are Sunday) or SUN to SAT |
Special characters: * means every value, a comma builds a list (1,15), a hyphen a range (9-17) and a slash a step: */15 gives 0, 15, 30 and 45, and 5-20/5 gives 5, 10, 15 and 20.
Cron schedule examples
*/15 * * * *: every 15 minutes, 96 runs a day.0 0 1 * *: at 00:00 on day 1 of the month, handy for a monthly report.0 17 * * 5: at 17:00 every Friday, the classic end-of-week export.0 2 * * 0and0 2 * * 7: identical, at 02:00 on Sunday.
The OR rule between day of month and day of week
When both day fields are restricted, classic cron runs the job when either one matches. So 0 12 13 * 5 does not mean “Friday the 13th”: it runs on the 13th of every month and also every Friday. Counting from November 14, 2026, that gives Friday November 20 and 27, then December 4, 11 and Sunday December 13. A field that starts with *, such as */2, counts as unrestricted, and the rule becomes an AND again.
Time zones and daylight saving time
Cron follows the machine's local clock. A server set to UTC fires 0 14 * * * at 9:00 in New York during winter and at 10:00 in summer. On March 8, 2026, 02:30 does not exist in New York: a fixed-time job such as 30 2 * * * runs right after the jump, at 03:00, and the list flags it. On November 1, 2026, 01:30 happens twice: a fixed-time job runs once, while a job with * in its minute or hour field runs in both passes.
Variants between schedulers
Some tools add a seconds field at the front (6 fields) or a year at the end (7 fields): tick “Seconds as first field”. Many accept shortcuts such as @daily (0 0 * * *) or @reboot (at startup). L (last), W (nearest weekday), # (nth weekday, MON#2 for the second Monday) and ? are not standard: tick “Interpret L, W, # and ?” to read them. Watch out as well for schedulers that number days from 1 (Sunday) to 7, or apply AND instead of OR.
Good habits
- Avoid the top of the hour, and midnight above all: everyone schedules there.
17 3 * * *spreads the load better than0 0 * * *. - Log the output: append
>> /var/log/backup.log 2>&1to the command so failures leave a trace.
Frequently asked questions
How do I run a job every 5 minutes?
Use */5 * * * *. It runs at :00, :05, :10 and so on up to :55, which is 288 times a day.
Why does my job skip some months?
With 0 0 31 * *, months with 30 days and February are simply skipped, so the job runs 7 times a year. For the last day of every month you need a scheduler that understands L.
Why is my 6-field expression rejected?
Classic cron reads only 5 fields. If your scheduler puts seconds first, tick “Seconds as first field”: the tool then accepts 6 or 7 fields.
Is my expression sent anywhere?
No, everything is computed in your browser. The share link only holds the expression, the time zone and the options.