Hunt
Skip to content

Cron Expression Explainer

Type a cron expression to read it in plain English, check each field, and see when it will next run, in your time zone or UTC. Standard crontab syntax, 6-field expressions with seconds (node-cron, Spring) and Quartz (with ?, L, W and #) are supported, and the differences between them are pointed out.

Runs in your browser

The five fields

A standard cron expression has five fields separated by spaces: minute (0–59), hour (0–23), day of the month (1–31), month (1–12 or JAN–DEC) and day of the week (0–7 or SUN–SAT, where 0 and 7 are Sunday). It's used by crontab, GitHub Actions schedules, Kubernetes CronJobs and most cloud schedulers.

  • * means every value; 5 one value; 1-5 a range; 1,15 a list.
  • */15 means every 15th value from the start (0, 15, 30, 45); 5/15 starts at 5.
  • Macros: @hourly, @daily (or @midnight), @weekly, @monthly and @yearly (or @annually).

How to use the Cron Expression Explainer

  1. Type a cron expression, or choose an example.
  2. Read the plain-English description, and check the dialect the tool detected.
  3. Check each field's value against its allowed range in the fields table.
  4. See the next runs in your time zone or in UTC.

Examples

Every 15 minutes during working hours

Input
*/15 9-17 * * 1-5
Output
Every 15 minutes past every hour from 9 through 17 on Monday through Friday.

The last run each day is at 17:45, because the hour field includes 17.

Twice a month

Input
0 9 1,15 * *
Output
At 09:00 on day 1 and 15 of the month.

Day of month or day of week

Input
0 0 1 * 1
Output
At 00:00 on day 1 of the month, or on Monday.

Both day fields are set, so this runs on the 1st and on every Monday.

Quartz: the second Monday of each month

Input
0 0 12 ? * MON#2
Output
At 12:00 on the second Monday of the month.

Quartz has a seconds field first, ? for "no specific day of the month" and # for the nth weekday.

Day of month OR day of week

The most surprising rule in cron: when both day fields are restricted, the job runs on days that match either of them. 0 0 1 * 1 runs on the 1st of every month and on every Monday, not only on Mondays that fall on the 1st. If either field starts with *, both must match. The tool warns when this applies.

Seconds and Quartz

Some schedulers add a seconds field at the start. node-cron and Spring use six fields with the same rules as standard cron. Quartz (Java) also has seconds, an optional year, and different rules: day-of-week 1 is Sunday, one of the two day fields must be ?, and it supports L (last), W (nearest weekday) and # (nth weekday of the month, so MON#2 is the second Monday). Detect dialect chooses from the number of fields and whether ? is used; choose one explicitly if it guesses wrong.

Time zones

Cron runs in the time zone of the machine or service: often UTC on servers and in CI. GitHub Actions schedules are always UTC. Check the next runs in UTC if you're unsure, and remember that a daily job set between 01:00 and 03:00 local time can be skipped or run twice when clocks change.

Options

Dialect
Standard (5 fields), With seconds (6 fields, as node-cron and Spring) or Quartz (6 or 7 fields). Detect dialect uses 5 fields as standard, and 6 or 7 fields as Quartz if ? appears, otherwise as With seconds.
Times in
Show the next runs in your time zone or in UTC. The expression itself has no time zone.

Limitations

  • Next runs are searched up to 8 years ahead.
  • Non-standard extensions of some schedulers, such as Jenkins' H or AWS EventBridge's 6-field syntax with a year, aren't supported.
  • Times that don't exist because clocks go forward are skipped, as most cron implementations do.

Frequently asked questions

How do I run a job every 5 minutes?

*/5 * * * *. For every 5 minutes during office hours on weekdays, */5 9-17 * * 1-5.

What does 0 0 * * 0 mean?

At midnight every Sunday, the same as @weekly. In standard cron, 0 and 7 both mean Sunday.

Why did my job run on the wrong day?

Usually because both day fields were set, so cron ran on days matching either, or because the server uses UTC. Paste the expression here to check both.

How is Quartz cron different?

Quartz expressions start with a seconds field, may end with a year, number the days of the week from 1 (Sunday), require ? in one day field, and support L, W and #. A standard 5-field expression must be converted before Quartz accepts it.

Is anything sent to a server?

No. The expression is parsed and the run times are calculated in your browser.