How to use the cron expression parser
- Type or paste a cron expression with 5 fields, or 6 with a leading seconds field.
- Set the start time and the UTC offset of the machine that runs the job.
- Choose how many runs to list, then read the plain-English meaning and the list of next run times.
How the cron job translator reads an expression
A standard cron expression has five fields separated by spaces: minute (0-59), hour (0-23), day of month (1-31), month (1-12 or JAN-DEC) and day of week (0-7 or SUN-SAT, where both 0 and 7 mean Sunday). Each field can hold a single value, a list such as 1,15, a range such as 9-17, a step such as */10, or a combination like 0-30/10. A star means every value in the field.
This cron job translator checks every field against those limits, then turns the schedule into a sentence and lists the next run times. For */15 9-17 * * 1-5 it answers: every 15 minutes, between 09:00 AM and 05:59 PM, Monday through Friday. If a value is out of range, a step is zero, or a range runs backwards, you get a specific error instead of a guess. A cron job checker like this is useful before you paste a schedule into a crontab, a Kubernetes CronJob, a GitHub Actions workflow or a cloud scheduler.
Cron to human readable: common examples
These are some of the most searched schedules and what they mean in plain words. Use them as a quick cron to human readable reference, or paste your own into the box above.
| Expression | Plain English |
|---|---|
* * * * * | Every minute |
*/5 * * * * | Every 5 minutes |
0 * * * * | Every hour |
0 0 * * * | At 12:00 AM |
30 9 * * 1-5 | At 09:30 AM, Monday through Friday |
0 0 1 * * | At 12:00 AM, on day 1 of the month |
0 0 1 1 * | At 12:00 AM, on day 1 of the month, only in January |
0 */2 * * * | On the hour, every 2 hours |
15,45 8-17 * * * | At 15 and 45 minutes past the hour, between 08:00 AM and 05:59 PM |
Notice that 0 * * * * means the top of every hour, while * * * * * means every single minute. A common mistake is writing * 9 * * * and expecting one run at 9:00. It actually runs every minute from 09:00 to 09:59.
Day of month and day of week: the OR rule
When both the day-of-month and the day-of-week fields are restricted, classic cron runs the job when either one matches. So 0 12 15 * 1 fires at noon on the 15th of every month and also at noon on every Monday. It does not mean "the 15th, only if it is a Monday". When one of the two fields is a star, only the other one applies, so 0 12 * * 1 is Mondays only.
Adding a step such as */2 to one of the two fields keeps the AND behaviour used by Vixie cron and cronie, because the field still starts with a star. Some libraries treat it as a restricted field and use OR instead, so check how your scheduler behaves if you rely on this.
Six-field expressions and what is not supported
Some schedulers add a leading seconds field, giving six fields: second minute hour day-of-month month day-of-week. This cron expression parser accepts that form, so */30 * * * * * runs every 30 seconds and its run times show seconds. Quartz style seven-field expressions with a year, and the Quartz extras L, W and #, are rejected with a message rather than guessed at.
Aliases are supported: @yearly and @annually (0 0 1 1 *), @monthly (0 0 1 * *), @weekly (0 0 * * 0), @daily and @midnight (0 0 * * *), and @hourly (0 * * * *). @reboot has no calendar time, so it cannot be listed.
Time zones and the UTC offset setting
Cron has no time zone of its own: it runs on the clock of the machine, container or service that hosts it. Most cloud schedulers and Kubernetes clusters use UTC by default, so a job written as 0 9 * * * may run at 9:00 UTC and not at 9:00 in your office.
Choose the UTC offset of the scheduler's clock and the list shows each run both as local wall-clock time and as UTC. The offset is fixed, so daylight saving changes are not applied: if your server follows a daylight saving zone, run the tool twice with the winter and summer offsets. To translate a UTC timestamp into a named US zone, use the UTC to CST converter, and to build a schedule from scratch use the cron builder.
Cron job decoder checks that catch real bugs
Use the cron job decoder output to review a schedule before it goes live.
- Check the first run time: if it is not when you expected, the field order is probably wrong.
- Look at the gaps between runs.
*/45 * * * *runs at minute 0 and 45 of every hour, so the gap alternates between 45 and 15 minutes. - Day 31 only exists in seven months, and
0 0 31 2 *never runs at all. The tool says so instead of listing nothing silently. - February 29 schedules run once every four years, as the leap day example shows.
- Names are case-insensitive, so
mon-friandMON-FRIare the same.
Worked examples
| Example | Input | Result |
|---|---|---|
| Every 15 minutes during office hours | Cron expression: */15 9-17 * * 1-5; Start from (local time, 24-hour): 2026-11-06 16:50; UTC offset of the schedule: 0; How many runs to list: 5 | Meaning: Every 15 minutes, between 09:00 AM and 05:59 PM, Monday through Friday; Format: 5-field cron; Day rule: Day-of-month AND day-of-week (at most one is restricted); Offset used: UTC+00:00; Next run: Fri 2026-11-06 17:00 |
| Weekday morning report in India time | Cron expression: 30 9 * * MON-FRI; Start from (local time, 24-hour): 2026-11-06 09:00; UTC offset of the schedule: 330; How many runs to list: 5 | Meaning: At 09:30 AM, Monday through Friday; Format: 5-field cron; Day rule: Day-of-month AND day-of-week (at most one is restricted); Offset used: UTC+05:30; Next run: Fri 2026-11-06 09:30 |
| Day-of-month OR day-of-week rule | Cron expression: 0 12 15 * 1; Start from (local time, 24-hour): 2026-11-06 00:00; UTC offset of the schedule: 0; How many runs to list: 6 | Meaning: At 12:00 PM, on day 15 of the month, and on Monday; Format: 5-field cron; Day rule: Day-of-month OR day-of-week (both are restricted, so either one matches); Offset used: UTC+00:00; Next run: Mon 2026-11-09 12:00 |
| Leap day backup | Cron expression: 0 0 29 2 *; Start from (local time, 24-hour): 2026-01-01 00:00; UTC offset of the schedule: 0; How many runs to list: 3 | Meaning: At 12:00 AM, on day 29 of the month, only in February; Format: 5-field cron; Day rule: Day-of-month AND day-of-week (at most one is restricted); Offset used: UTC+00:00; Next run: Tue 2028-02-29 00:00 |
| Every 30 seconds (6 fields) | Cron expression: */30 * * * * *; Start from (local time, 24-hour): 2026-11-06 10:00:00; UTC offset of the schedule: 0; How many runs to list: 4 | Meaning: Every 30 seconds; Format: 6-field cron (seconds first); Day rule: Day-of-month AND day-of-week (at most one is restricted); Offset used: UTC+00:00; Next run: Fri 2026-11-06 10:00:30 |
FAQ
What does a cron job translator do?
It turns a cron expression such as 30 9 * * 1-5 into plain English (at 09:30 AM, Monday through Friday) and lists the next times the job will run, so you can confirm the schedule before using it.
How do I use this as a cron parser for 6-field expressions?
Paste an expression with six fields and the first one is read as seconds. For example, */30 * * * * * is every 30 seconds, and the run list shows seconds.
Can I use this cron job converter for crontab aliases like @daily?
Yes. @yearly, @annually, @monthly, @weekly, @daily, @midnight and @hourly are expanded to their five-field forms and then described and scheduled like any other expression.
What is the difference between 0 and 7 for the day of week?
Both mean Sunday in standard cron. The tool accepts 0 to 7 and names such as SUN, so 0 22 * * 7 runs on Sundays at 10:00 PM.
Why does my schedule run on more days than I expected?
When both the day-of-month and day-of-week fields are restricted, cron runs the job when either matches. Set one of them to a star if you want only the other.
Does it handle daylight saving time?
No. The schedule uses a fixed UTC offset that you choose, because a plain cron expression does not say which zone rules apply. Run it with both offsets if your server changes clocks.