Cron expression explainer

Read any cron expression in plain words and see its next 10 runs.

Five fields: minute, hour, day of month, month, day of week. A sixth field in front adds seconds.

Common schedules
In plain words

At 9:00 AM, Monday through Friday

Field by field
FieldValueMeaning
minute00
hour99:00 AM
day of month*every day
month*every month
day of week1-5Monday through Friday

Next 10 runs

Working out the next runs…

Daylight saving: a time that does not exist (the skipped hour) is skipped; a time that happens twice runs once, the first time.

What this tool does

A cron expression is a compact way to write a schedule: */5 * * * * means "every 5 minutes" and 0 9 * * 1-5 means "at 9:00 on weekdays". It is used by Linux crontab, CI systems, container schedulers and many job libraries, and it is easy to get subtly wrong. This tool reads the expression the same way a scheduler does, says what it means in your language, breaks it down field by field and lists the next 10 times it will run in the time zone you choose. The expression never leaves your browser.

The five fields

Fields are separated by spaces, in this order. Put a sixth field in front and it becomes the seconds, as in Spring and Quartz.

FieldAllowed valuesNames
minute0 to 59
hour0 to 23
day of month1 to 31
month1 to 12JAN to DEC
day of week0 to 7, where 0 and 7 are both SundaySUN to SAT

Each field accepts * for every value, a number, a list such as 1,15, a range such as 9-17, and a step: */15 means every 15th value, 10-30/5 means every 5th value from 10 to 30 and 5/20 means every 20th value starting at 5. Names can be used in lists and ranges in any case, for example MON-FRI. The shortcuts @hourly, @daily, @midnight, @weekly, @monthly and @yearly are understood too.

Worked examples

  • */5 * * * * is "every 5 minutes".
  • 0 9 * * 1-5 is "at 9:00 AM, Monday through Friday". Seen from Ho Chi Minh City on the morning of Tuesday 13 October 2026, the next runs are at 09:00 on 13, 14, 15 and 16 October and then on Monday 19 October; the weekend is skipped.
  • 15 10 * * MON,WED,FRI is "at 10:15 AM on Monday, Wednesday and Friday".
  • */10 * * * * * has six fields, so the first one is seconds: every 10 seconds.
  • 0 0 29 2 * runs on 29 February only. From 2026 the next runs are in 2028 and 2032.
  • */7 * * * * is not "every 7 minutes". The minutes are 0, 7, 14 and so on up to 56, and then 0 again, so there is a gap of 4 minutes at the top of every hour. A step only divides evenly into 60 for 1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30.

Day of month and day of week

When both the day-of-month and the day-of-week fields are restricted, classic cron runs the job when either one matches, not both. So 0 0 13 * 5 does not mean "Friday the 13th": it means "every 13th, and every Friday". In October 2026 it fires on the 2nd, 9th, 13th, 16th, 23rd and 30th. If one of the two fields starts with *, only the other one counts, and for "Friday the 13th" you need to check the date inside the job. This tool follows that rule and shows a note when it applies.

Time zones and daylight saving

A cron expression has no time zone of its own: the scheduler uses the zone of the machine or the setting of the service. Pick the zone yours uses, and the run times above are computed in it. Clock changes need a decision, and this tool makes it explicit. When the clocks jump forward, the skipped hour does not exist, so a job set for 02:30 is skipped that day (in New York on 8 March 2026 the clock went from 01:59 to 03:00). When the clocks go back, a time such as 01:30 happens twice, and the job runs once, at the first 01:30 (1 November 2026). Real schedulers differ in these edge cases, so keep important jobs away from the hour of the change, or run them in UTC.

What is not supported

The special characters ?, L, W and # (last day, nearest weekday, the n-th weekday) and a trailing year field belong to Quartz and Spring schedulers, not to classic cron. This tool says so instead of guessing; rewrite the expression with plain fields, or check the documentation of the scheduler you use. The shortcut @reboot has no schedule to explain.

Common mistakes

  • Reading the fields in the wrong order, for example writing the hour first.
  • Using */n with an n that does not divide the range evenly.
  • Forgetting that day-of-week 0 and 7 are both Sunday, and that a leading seconds field shifts every other field by one.
  • Assuming the schedule runs in your local time when the server uses UTC.

To check what a schedule produces in a log, the regex tester helps with the line patterns, and the diff checker compares two versions of a crontab.

Frequently asked questions

Does it support seconds?

Yes. Write six fields and the first one is read as seconds, the layout used by Spring and Quartz. With five fields the schedule is the classic minute-first form.

Why does my expression with a day of month and a weekday run so often?

Because classic cron runs the job when either field matches. `0 0 13 * 5` runs on every 13th and on every Friday. Use a star in one of the two fields to require only the other.

Can I use ?, L, W or # in the expression?

Not in this tool. They are extensions of Quartz and Spring schedulers. The tool tells you which character it stopped at, so you can rewrite the expression with plain fields.

What happens at a daylight saving change?

A time that does not exist is skipped for that day, and a time that happens twice runs once, at its first occurrence. Real schedulers vary, so avoid the hour of the change for important jobs.

Is the expression sent anywhere?

No. It is parsed in your browser and the run times are computed there with the time zone data your browser already has.