Cron Expression Generator Online
Build cron expressions visually with preset schedules or field-by-field inputs. Get an instant plain-English description of your schedule. No signup, runs entirely in your browser.
⏱ 9 min read · Complete guide below
Runs at 9 AM on weekdays (Mon–Fri).
How to Build a Cron Expression
- 1Click a preset to start from a common schedule, or set each field manually.
- 2Adjust the five fields: Minute, Hour, Day of Month, Month, and Day of Week.
- 3Read the plain-English description below the fields to confirm the schedule is correct.
- 4Click Copy Expression and paste it into your crontab, CI pipeline, or cloud scheduler.
Cron Field Quick Reference
Each field accepts a specific value, a wildcard (*), a step value (*/5), a range (1-5), or a list (1,3,5). Combining these lets you express nearly any recurring schedule. The most common gotcha is day of month vs day of week — if you set both, most cron daemons will fire on either condition matching, not both simultaneously.
Reading a Cron Expression Field by Field
A cron expression is five space-separated fields that answer, in order: minute (0–59), hour (0–23), day of month (1–31), month(1–12), and day of week (0–6, with 0 as Sunday). A job runs whenever the current time matches every field. Each field accepts more than a single number: an asterisk (*) means “every value,” a step (*/5) means “every fifth value,” a range (9-17) is inclusive on both ends, and a list (1,3,5) picks specific values. So 0 9 * * 1-5 reads as “at minute 0 of hour 9, every day, in every month, on weekdays,” i.e. 9 AM Monday to Friday. The plain-English description this tool shows lets you confirm you have read the fields correctly before you rely on them.
The Day-of-Month vs Day-of-Week Trap
The most notorious source of cron bugs is the relationship between the two “day” fields. When you set both the day-of-month and the day-of-week to specific values, most cron implementations use OR logic, not AND — the job runs whenever either condition matches. So 0 0 13 * 5 does not mean “Friday the 13th”; it means “every 13th of the month and every Friday.” If you need a job on a specific weekday, leave day-of-month as *; if you need a specific date, leave day-of-week as *. Setting both is almost always a mistake unless you genuinely want the union of the two schedules.
Cron in the Cloud, and the Timezone Gotcha
Cron long ago outgrew the traditional Unix crontab. The same five-field syntax now schedules jobs in GitHub Actions, GitLab CI, Kubernetes CronJobs, AWS EventBridge, and countless other platforms — so learning it once pays off across your whole toolchain. There is one difference to watch closely: timezones. Classic Unix cron runs in the server's local timezone, but most cloud schedulers default to UTC, which is a frequent cause of jobs firing an hour or several hours off from what was intended. Whenever you deploy a schedule, confirm which timezone the platform uses, and remember that daylight-saving changes can shift local-time schedules too. Testing the next few fire times before going live is the simplest way to avoid these surprises.
Common Cron Patterns
Step values (*/n)
*/15 * * * * — every 15 minutes. */2 * * * * — every 2 minutes. Steps divide the field range evenly starting from 0.
Ranges (n-m)
0 9-17 * * 1-5 — every hour from 9 AM to 5 PM on weekdays. Ranges are inclusive on both ends.
Lists (a,b,c)
0 0 1,15 * * — at midnight on the 1st and 15th of every month. Great for bi-monthly tasks.
Monthly on last day
Standard cron cannot reference "last day of month" directly. Use a wrapper script that checks date +%d against the last day, or use a platform like AWS EventBridge that supports L.
Timezone awareness
Unix cron runs in the system timezone. Cloud schedulers (GitHub Actions, AWS, GCP) often default to UTC. Always check which timezone your scheduler uses to avoid off-by-one-hour bugs.
Test before deploying
Paste your expression into a cron debugger or this tool's description output to confirm the next 5 scheduled fire times before adding it to production crontabs.
A Brief History of Cron
Cron is one of the oldest tools in the Unix world still in daily use. Early versions appeared in the 1970s, and the design that persists today — a daemon that wakes up each minute and runs any jobs whose schedule matches the current time — was refined by Paul Vixie in the 1980s. “Vixie cron” became the basis for the cron found on most Linux systems, and its five-field syntax has proven so durable that it long outlived the specific machines it was written for.
The name comes from chronos, the Greek word for time, and the schedules themselves live in a file called the crontab (cron table). What makes cron remarkable is its longevity: a syntax designed for scheduling backups and log rotations on 1980s Unix servers is now the lingua franca of scheduling across cloud platforms and modern developer tools decades later, precisely because it is compact, expressive, and universally understood.
Cron vs Modern Alternatives
Classic Unix cron is simple and reliable, but it has limitations that spawned a range of alternatives worth knowing. On modern Linux, systemd timers offer a more powerful (if more verbose) option, with features cron lacks — running missed jobs after downtime, dependency management, and better logging integration. In the cloud, managed schedulers like AWS EventBridge, GCP Cloud Scheduler, and the scheduled workflows in GitHub Actions and GitLab CI run cron-style schedules without you maintaining a server at all.
For application-level work, job queues and schedulers such as the Quartz Scheduler (Java), Celery beat (Python), or cron libraries in Node.js provide scheduling inside your app, often with sub-minute precision and richer control. The good news is that nearly all of these adopted cron's five-field syntax, so the expression you build here transfers directly. Learning cron once genuinely pays off across the whole ecosystem — you are learning a standard, not just one tool.
Best Practices for Reliable Scheduled Jobs
Writing the cron expression is the easy part; making the scheduled job reliable is where experience shows. The most important principle is idempotency — design the job so that running it twice does no harm. Schedulers occasionally fire a job late, twice, or after a missed run, so a job that assumes it runs exactly once can corrupt data. A job that checks what work actually needs doing and does only that is far safer.
Two more habits prevent most production incidents. First, prevent overlap: if a job can sometimes run longer than its interval, a naive schedule will start a second copy while the first is still running, which can pile up and exhaust resources. Use a lock file or a scheduler feature to ensure only one instance runs at a time. Second, log and monitor: a silent cron job that fails is invisible until something downstream breaks. Capture output to a log, and for critical jobs use a “dead man's switch” monitor — a service that expects a check-in each run and alerts you if the job stops reporting. Combined with confirming the schedule's timezone and testing the next few fire times before deploying, these practices turn a fragile cron job into a dependable one.
Frequently Asked Questions
What is a cron expression?
A cron expression is a string of five fields (minute, hour, day of month, month, day of week) that defines a recurring schedule for automated tasks. It is used in Unix-like systems via the crontab file and in many cloud schedulers and CI/CD tools.
What do the five fields mean?
From left to right: minute (0–59), hour (0–23), day of month (1–31), month (1–12), and day of week (0–6, where 0 is Sunday). An asterisk (*) means "every value". A slash (*/5) means "every 5th value". A hyphen (1-5) defines a range.
How do I run a job every 15 minutes?
Use the expression */15 * * * *. The */15 in the minute field means "at 0, 15, 30, and 45 minutes past every hour". Click the "Every 15 minutes" preset button to apply it instantly.
How do I run a job on weekdays only?
Set the day of week field to 1-5, which covers Monday through Friday. For example, 0 9 * * 1-5 runs at 9 AM on every weekday. Click the "Every weekday at 9am" preset to apply this.
What is the difference between day of month and day of week?
Day of month (field 3) specifies a calendar date — e.g. the 1st or 15th. Day of week (field 5) specifies a weekday — e.g. Monday. When both are non-asterisk, most cron implementations run when either condition is true (OR logic), not both.
Does cron support seconds?
Standard Unix cron does not support seconds — the smallest interval is one minute. Some tools like Quartz Scheduler (Java) and AWS EventBridge extend the syntax to include a seconds field, but that is non-standard.
Is my data private?
Yes. The tool runs entirely in your browser. No expressions or schedule data are sent to any server.
What does the asterisk (*) mean in a cron expression?
An asterisk in a field means "every value" for that field. So * in the minute field means every minute, and * in the day-of-week field means every day of the week. A cron expression of * * * * * therefore runs every single minute. Asterisks are combined with the specific values in the other fields to narrow the schedule — for example, 0 * * * * (minute fixed at 0, everything else every value) runs once at the top of every hour.
How do I schedule a job to run every N minutes or hours?
Use a step value with the slash operator. In the minute field, */15 means "every 15 minutes" (at 0, 15, 30, and 45 past each hour), and */5 means every 5 minutes. In the hour field, */2 means every two hours. Steps divide the field's range evenly starting from its lowest value, so */20 in the minute field fires at 0, 20, and 40. This tool's presets include the most common step schedules.
Why is my scheduled job running an hour off?
This is almost always a timezone issue. Traditional Unix cron uses the server's local timezone, while most cloud schedulers such as GitHub Actions, AWS EventBridge, and GCP default to UTC. If you write a schedule assuming your local time but the platform interprets it as UTC, the job fires at the wrong hour. Daylight-saving transitions can also shift local-time schedules. Always confirm which timezone your scheduler uses and adjust the hour field accordingly.
Can cron run a job every second?
No. Standard Unix cron has a minimum resolution of one minute — the smallest field is the minute, so it cannot schedule anything more frequent. Some specialised schedulers, such as the Quartz Scheduler in Java and AWS EventBridge, extend the syntax with an extra seconds field, but that six-field format is non-standard and not understood by ordinary crontab. For sub-minute intervals you generally need a long-running process or a dedicated scheduler rather than plain cron.