Cron Expression Explainer - Plain English and the Next 10 Run Times
Paste a standard five-field cron expression such as 0 9 * * 1-5 and read what it does in plain English, field by field, and see the next ten times it runs in the time zone you choose, Asia/Colombo included.
Maintained by Hirantha Sandaruwan Lakshan. Updated 15 October 2026.
About this tool
It follows the crontab rules of Vixie cron and cronie, including the either/or rule for day of month and day of week. Quartz, Spring and AWS cron are different formats and are not supported. Nothing leaves your browser.
How it works
A standard crontab entry has five fields separated by spaces: minute (0 to 59), hour (0 to 23), day of month (1 to 31), month (1 to 12 or JAN to DEC) and day of week (0 to 7, where 0 and 7 are both Sunday, or SUN to SAT). A field can hold a list (1,15), a range (1-5), a star for every value, and a step: */5 means every fifth value, and 1-10/2 means 1, 3, 5, 7 and 9. A step must follow a star or a range: cronie rejects a step after a single number, as in 5/15. The macros @yearly, @annually, @monthly, @weekly, @daily, @midnight and @hourly stand for ready-made schedules (cronie reads their names in lower case only, so @DAILY is an error), and @reboot means once after the machine boots, when the cron service starts. The plain English text is produced by this tool's own code from the parsed fields. Cron looks at its entries once a minute, so the smallest step is one minute and there is no seconds field.
When both the day of month and the day of week are restricted, the job runs when either one matches. crontab(5) says: if both fields are restricted (do not contain the star character), the command will be run when either field matches the current time. So 30 4 1,15 * 5 runs at 04:30 on the 1st, on the 15th and on every Friday, not only on a Friday that is the 1st or 15th. The test is made on the first character of the field, which is how cronie's source reads it: a field that starts with * counts as unrestricted even with a step, so 0 0 */2 * 1 means every second day of the month that is also a Monday, because then both must match. The tool describes both cases and explains which one applies.
Cron runs in the time zone of the machine, or the one set by CRON_TZ in cronie. The next run times are worked out in the zone you pick: each local clock time that matches the schedule is turned into a real moment with your browser's time zone data, so the offset from UTC and any daylight saving change are the zone's own. Clock changes need a rule, and cron programs differ. cronie's cron(8) says that local time changes of less than three hours are handled in a special way for jobs that run at a specific time: if the time was adjusted forward, the jobs that would have run in the skipped interval run immediately, and if it was adjusted backward, running the same job twice is avoided. Debian's cron(8) says the same and spells out which jobs are affected: those without a star in the minute or hour field. Jobs with a star there run by the new time, and cronie's source tests those same two fields. The crontab(5) page of cronie describes plain matching instead: a time that does not exist never matches, and a time that happens twice matches twice. The tool follows the cron(8) rule by default and can show plain matching, and it marks every run that a clock change affects. Other cron programs may differ, so check a run near a change on your own system.
Several other tools use the word cron for a different format. Quartz and Spring put a seconds field first, so they have six fields (Quartz allows a seventh, the year). Amazon EventBridge has six fields with no seconds and a year last. Quartz, Spring and EventBridge all use ? L W and # in the day fields, and EventBridge requires a question mark in one of the two day fields and counts the days of the week from 1. This tool does not read them: a six or seven field expression, or a field with ? L W or #, gets a message that says so rather than a wrong answer. If you paste a whole crontab line, the text after the fifth field is shown as the command and ignored. Names such as MON-FRI are accepted, as cronie allows, although Debian's crontab(5) says ranges or lists of names are not allowed, so use numbers if you are unsure.
Worked examples
Weekdays at 9:00 in Sri Lanka
0 9 * * 1-5 in Asia/Colombo, starting from Friday 16 October 2026 at 10:00 Colombo time. The next run is Monday 19 October 2026 at 09:00 (UTC+05:30), which is 03:30 UTC. Colombo has no daylight saving time, so every run is at the same offset.
Day of month or day of week
30 4 1,15 * 5 runs at 04:30 on the 1st, on the 15th and on every Friday, because neither day field starts with a star. It does not wait for a Friday that is also the 1st or the 15th.
A job at 02:30 when the clocks go forward
30 2 * * * in America/New_York. On Sunday 8 March 2026 the clocks jump from 02:00 to 03:00, so 02:30 does not exist. The cronie rule runs the job at the change, 03:00 EDT (07:00 UTC). Plain matching skips that day. On Monday 9 March it runs at 02:30 EDT, 06:30 UTC, either way.
A job at 01:30 when the clocks go back
30 1 * * * in America/New_York. On Sunday 1 November 2026 the clocks go back from 02:00 to 01:00, so 01:30 happens twice: at 05:30 UTC (EDT) and again at 06:30 UTC (EST). The cronie rule runs a fixed-time job once, the first time. Plain matching runs it at both.
A step that does not divide the hour
*/7 * * * * runs at minutes 0, 7, 14, 21, 28, 35, 42, 49 and 56 of every hour, then starts again at minute 0 of the next hour. The gap from minute 56 to the next hour is only 4 minutes. For an even rhythm use a step that divides 60, such as */5, */10, */15 or */30.
Common cron expressions and what they mean
| Expression | What it means |
|---|---|
| * * * * * | Every minute |
| */5 * * * * | Every 5 minutes |
| */15 9-17 * * 1-5 | Every 15 minutes from 09:00 to 17:59, on Monday through Friday |
| 0 * * * * | Every hour, on the hour |
| 0 9 * * 1-5 | At 09:00, on Monday through Friday |
| 0 9,17 * * * | At 09:00 and 17:00 every day |
| 30 2 * * * | At 02:30 every day |
| 0 0 1 * * | At 00:00, on day 1 of the month |
| 0 0 1 1,4,7,10 * | At 00:00, on day 1 of the month, in January, April, July and October |
| 30 4 1,15 * 5 | At 04:30, on days 1 and 15 of the month or on Friday |
| 0 0 * * 0 | At 00:00, on Sunday |
| @daily | At 00:00 every day |
Frequently asked questions
Which time zone does cron use?
The time zone of the machine it runs on. cronie also lets a crontab set CRON_TZ for its own entries. Choose the zone your server uses in the time zone box, because the same expression runs at different moments in different zones. Asia/Colombo is UTC+05:30 all year.
What happens when both day of month and day of week are set?
If neither field starts with *, the job runs when either one matches, as crontab(5) says. 0 0 1 * 5 runs on the 1st of every month and on every Friday. If one of the two fields starts with *, both must match, so 0 0 */2 * 1 runs only on odd-numbered days that are also Mondays.
What does */5 mean, and why is */7 uneven?
A star with a step means every fifth value from the start of the range. In the minute field */5 is minutes 0, 5, 10 and so on up to 55. The step restarts each hour, so */7 gives 0, 7 and so on up to 56, and then 0 again four minutes later. Use a step that divides 60 for minutes and 24 for hours if you want an even rhythm.
Is Sunday 0 or 7?
Both. crontab(5) lists the day of week as 0 to 7 with 0 or 7 meaning Sunday. The tool treats them the same, and a range like 5-7 means Friday, Saturday and Sunday.
What does cron do when daylight saving time starts or ends?
It depends on the program. cronie's cron(8) says that for changes under three hours, a job that runs at a specific time and falls in a skipped interval runs immediately, and a job is not run twice when the clocks go back. Debian's cron(8) adds that jobs with * in the minute or hour field run by the new time. cronie's crontab(5) describes plain matching instead: a time that does not exist never matches and a repeated time matches twice. The tool shows the cron(8) behaviour by default, offers plain matching, and marks the affected runs. If it matters, run the server in UTC.
Why does my Quartz, Spring or AWS cron expression not work here?
Those are different formats. Quartz and Spring start with a seconds field, so they have six or seven fields. EventBridge has six, with a year at the end. All three also use ?, L, W and # in the day fields. Standard Unix cron has exactly five fields and none of those characters. The tool reports the mismatch instead of guessing.
Can I use names such as MON-FRI or JAN,JUL?
The tool accepts three-letter names for the month and day of week, in any case, in lists and ranges. cronie's crontab(5) allows that. Debian's crontab(5) says ranges or lists of names are not allowed, so on Debian or Ubuntu the safe choice is numbers, such as 1-5.
Does cron support seconds?
No. Standard cron has no seconds field, and the daemon examines its entries once a minute (crontab(5)). To run something more often than once a minute you need a loop in the script, a systemd timer, or a different scheduler.
What does the percent sign do in a crontab line?
In the command part of a crontab entry, an unescaped % is changed into a newline, and everything after the first % is sent to the command as standard input (crontab(5)). A date command such as date +%F in a crontab needs each % written as \%.
What does @reboot do?
It runs the command once after the machine boots, when the cron service starts. cronie leaves a lock file once it has run its @reboot jobs, so restarting only the cron service does not run them again; other cron programs may treat a restart differently. It has no clock schedule, so there are no run times to list.
Sources & references
- crontab(5), cronie (man7.org)
- cron(8), cronie (man7.org)
- cronie source: cron.c (the day matching and clock change logic)
- cronie source: entry.c (the field parser and macros)
- crontab(5), Debian cron
- cron(8), Debian cron (clock changes and which jobs they affect)
- Quartz CronTrigger tutorial (a different format)
- Spring CronExpression (a different format)
- Amazon EventBridge cron expressions (a different format)
Updated Oct 15, 2026