Cron Expression Generator guide
Pick minutes, hours, days, months, and weekdays from dropdowns and get a valid five-field cron expression with a plain-English summary and upcoming run times.
The five fields, in order
A standard cron expression is five fields separated by spaces: minute (0-59), hour (0-23), day of month (1-31), month (1-12), and day of week (0-6, where 0 is Sunday). 0 9 * * 1-5 reads as minute 0, hour 9, any day of the month, any month, Monday through Friday. In plain English: 9:00 AM on weekdays.
This generator builds that string from dropdowns so you never have to remember which position is which. Pick a preset or set each field, and the expression, a plain-English description, and the next five run times update instantly. It all runs in your browser.
The four operators you need
Asterisk (*) means every value. * in the hour field means every hour.
Slash (/) means step. */15 in the minute field means every 15 minutes: 0, 15, 30, 45. Steps count from the start of the range, so */7 in minutes fires at 0, 7, 14 ... 56 and then again at 0, a 4-minute gap at the top of the hour. Pick steps that divide evenly into 60 for minutes and 24 for hours.
Comma (,) means a list. 0,30 means minute 0 and minute 30.
Dash (-) means a range. 9-17 in the hour field means 9 AM through 5 PM, inclusive. Combined with */15 in the minute field, the last run is 17:45, not 17:00, which surprises people who wanted business hours to end at five.
Worked examples
Every 15 minutes during business hours on weekdays: */15 9-17 * * 1-5.
Nightly backup at 2:30 AM: 30 2 * * *.
First day of every quarter at midnight: 0 0 1 1,4,7,10 *.
Every Monday and Thursday at 6 PM: 0 18 * * 1,4.
Twice a day, at 8 AM and 8 PM: 0 8,20 * * *.
Cron has no syntax for "the last day of the month". The usual workaround is to run daily on days 28-31 and have the script check whether tomorrow is the 1st. Some schedulers (Quartz, AWS) add an L character for this, but standard crontab does not support it.
The day-of-month and day-of-week trap
This is the most misunderstood rule in cron. If you restrict both the day-of-month field and the day-of-week field, the job runs when either one matches, not both. 0 0 13 * 5 does not mean Friday the 13th. It means every 13th of the month and also every Friday.
The next-runs list on this page follows that rule, so you can see it happen. If you really need Friday the 13th, schedule 0 0 13 * * and have the script exit unless it is a Friday.
Time zones and where the schedule runs
Cron uses the time zone of the machine or service running it. On a Linux server that is usually the system time zone, often UTC in cloud images. GitHub Actions schedules always run in UTC. Kubernetes CronJobs use the controller's time zone unless you set spec.timeZone. Vercel and Cloudflare cron triggers run in UTC.
The next-runs preview here uses your computer's local time. If your job runs in UTC and you are in New York, 0 9 * * * fires at 4 or 5 AM your time depending on daylight saving. Convert before you commit, or the timestamp converter can help you check.
Daylight saving time creates edge cases on servers that use local time: a job scheduled at 2:30 AM may be skipped on the spring-forward night and run twice on the fall-back night, depending on the cron implementation. Schedule critical jobs outside 1-3 AM or run the server in UTC.
Pitfalls
Six-field and seven-field formats. Quartz (Java), Spring, and AWS EventBridge add a seconds field at the start and sometimes a year field at the end, and use ? in one of the day fields. A five-field expression pasted into those tools means something different. This generator produces standard five-field cron, which works in crontab, GitHub Actions, GitLab CI, Kubernetes, and most Node and Python schedulers.
GitHub Actions delays. Scheduled workflows can start several minutes late during busy periods, and schedules more frequent than every 5 minutes are not supported. Do not rely on exact timing.
Environment variables. Jobs run by crontab start with a minimal environment and a short PATH, so commands that work in your terminal can fail under cron. Use absolute paths to binaries and scripts.
Overlapping runs. If a job takes longer than its interval, cron starts another copy anyway. Use a lock (flock on Linux) for long jobs.
How we calculate: sources
Frequently asked questions
How do I write a cron expression for every 5 minutes?
Use */5 * * * *. The */5 in the minute field means every fifth minute: 0, 5, 10, and so on.
What is the cron expression for weekdays at 9 AM?
0 9 * * 1-5. Minute 0, hour 9, any day of the month, any month, Monday (1) through Friday (5).
What are the five fields in a cron expression?
Minute (0-59), hour (0-23), day of month (1-31), month (1-12), and day of week (0-6, Sunday is 0).
What happens if I set both day of month and day of week?
Standard cron runs the job when either field matches, not both. 0 0 13 * 5 runs on every 13th and every Friday.
Which time zone does cron use?
The time zone of the machine or service that runs it. GitHub Actions always uses UTC. The next-run preview here uses your local time.
Does it work with Quartz or AWS cron?
No. Those use six or seven fields with seconds and a year. This generator makes standard five-field cron for crontab, GitHub Actions, GitLab CI, and Kubernetes.
Is anything sent to a server?
Everything runs in your browser. Nothing you enter is uploaded to a server or stored by us.
What does */5 mean in a cron expression?
It means every fifth value of that field. In the minute field, */5 runs at minutes 0, 5, 10, and so on, which is every 5 minutes.
Is Sunday 0 or 7 in cron?
Both work in most cron implementations. 0 is the standard value and 7 is accepted as an alias. This generator uses 0 through 6, Sunday through Saturday.