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-5Plain English: at minute 0, at hour 9, on Mon through Fri
Quick Presets
Minute
0Hour
9Day of Month
*Month
*Day of Week
1-5Next 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
| Schedule | Expression | Use Case |
|---|---|---|
| Every minute | * * * * * | Health checks, queue pollers |
| Every 15 minutes | */15 * * * * | Cache warmers, status updates |
| Hourly on the hour | 0 * * * * | Log rotations, summary aggregations |
| Daily at 02:30 | 30 2 * * * | Database backups, low-traffic windows |
| Weekdays at 09:00 | 0 9 * * 1-5 | Morning reports, standup reminders |
| First of the month | 0 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.
Related Tools
Password Generator
Generate strong, secure passwords with customisable length and character options. Uses cryptographically secure randomisation.
WiFi QR Code Generator
Create a beautiful, printable QR code for your WiFi network. Guests scan to connect instantly β no typing passwords. Choose from 6 card styles and download a print-ready image.