Cron Expression Builder

Build and understand cron expressions with an interactive visual editor. Click to set schedules, see plain-English translations and next run times.

0 9 * * 1-5

Plain English: at minute 0, at hour 9, on Mon through Fri

Quick Presets

Minute

0

Hour

9

Day of Month

*

Month

*

Day of Week

1-5

Next 5 Run Times

  • 1Fri 01 May 2026 at 09:00
  • 2Sat 02 May 2026 at 09:00
  • 3Sun 03 May 2026 at 09:00
  • 4Mon 04 May 2026 at 09:00
  • 5Tue 05 May 2026 at 09:00

What the Five Cron Fields Mean

A standard cron expression has five fields, separated by spaces, in this order: minute (0-59), hour (0-23), day of month (1-31), month (1-12), and day of week (0-6, where 0 and 7 both mean Sunday). The tool defaults to '0 9 * * 1-5', which fires at 09:00 every weekday, the most common schedule for a morning report job.

Each field accepts four notations: a single value (5), a list (1,15,30), a range (1-5), or a step (*/15 for 'every 15'). Combine them as needed; '0 8-18/2 * * 1-5' means 'on the hour, from 08:00 to 18:00, every two hours, weekdays only'. The tool parses your input, shows the plain-English translation, and computes the next five firing times so you can sanity-check the schedule before deploying.

Where Cron Actually Runs and Why Timezones Bite

The same cron expression can fire at different wall-clock times depending on where it runs. Linux crontab uses the system timezone, which on most production servers is UTC. Vercel Cron runs in UTC. AWS EventBridge schedule expressions accept an explicit timezone but cron expressions still default to UTC. GitHub Actions cron runs in UTC and warns you not to rely on it firing on time during high-load periods.

The lesson: pick UTC for anything serverless, and write the expression for UTC even if your team thinks in local time. A 'daily 9am report' in London is '0 9 * * *' in winter and '0 8 * * *' in summer if you want it to land at 09:00 BST. If you need DST-aware scheduling, run the job hourly and gate it inside the code with a timezone-aware check, or use a scheduler that supports IANA timezone names natively such as Quartz or Temporal.

Common Cron Recipes

ScheduleExpressionUse Case
Every minute* * * * *Health checks, queue pollers
Every 15 minutes*/15 * * * *Cache warmers, status updates
Hourly on the hour0 * * * *Log rotations, summary aggregations
Daily at 02:3030 2 * * *Database backups, low-traffic windows
Weekdays at 09:000 9 * * 1-5Morning reports, standup reminders
First of the month0 0 1 * *Monthly invoices, billing cycles

Frequently Asked Questions

What does 0 in the day-of-week field mean?

In standard cron, 0 means Sunday and 6 means Saturday. Many implementations also accept 7 as Sunday for compatibility with older Unix systems. To run something on weekends, use '0,6' or '6-7'. To run only on weekdays, use '1-5'. The tool's preset list covers the most common patterns so you don't have to remember the numbering.

Can I use named days and months?

Most modern cron implementations accept three-letter abbreviations: MON-SUN for days of the week, JAN-DEC for months. So '0 9 * * MON-FRI' is identical to '0 9 * * 1-5'. The strict POSIX cron only accepts numbers, so for maximum portability across BSD, Solaris, and minimal Docker images, stick to digits. Vercel Cron, GitHub Actions, and crontab on Linux all accept names.

What happens if the day-of-month and day-of-week fields conflict?

Standard cron uses an OR rule when both fields are restricted: the job runs if either condition matches. So '0 0 15 * 1' fires on the 15th of every month AND on every Monday, not on Mondays that are also the 15th. To get an AND rule, you have to gate inside your script or use Quartz, which uses '?' to mark one of the two as 'no specific value'.

Why didn't my cron job run?

The four most common causes: the expression resolves to a time that has already passed today (cron does not catch up missed runs unless you use anacron); the job's user has no PATH set in their crontab (specify full paths to binaries); the timezone differs from what you assumed (run 'date' on the server to confirm); or stdout/stderr is silently redirected and an error is swallowed. Add 'MAILTO=you@example.com' or pipe to a log file to surface failures.

More tools β†’