Cron Generator

Compose cron expressions from minute, hour, day, month, and weekday selectors. Preview the next five scheduled times.

Processed in your browserNo upload, no signup

Expression

0 9 * * *

At 09:00 every day.

Next 5 runs

    Presets

    Why Cron Expressions Matter

    Scheduling automation is the backbone of reliable infrastructure. Whether you are running nightly database backups, sending weekly digest emails, or rotating log files, you need a predictable way to tell your system when to act. Cron expressions provide that predictability in a compact, human-readable format that has been the standard on Unix-like systems since the 1970s. Instead of writing a full program to determine when a task should run, you declare a single five-field string and let the scheduler handle the rest. This simplicity is why cron has survived for decades and why nearly every modern platform — from Linux servers to GitHub Actions to Kubernetes CronJobs — either uses cron syntax directly or draws heavy inspiration from it.

    Understanding cron expressions gives you precise control over your automation. A single expression like 30 2 * * 1 can replace pages of custom scheduling logic. It eliminates entire classes of bugs that come from hand-rolling date comparisons, leap year handling, and month-length calculations. When you invest a few minutes learning the five fields, you gain a portable skill that transfers across operating systems, cloud providers, and CI/CD platforms. The ability to read, write, and debug cron expressions is one of the most practical skills for anyone who works with servers, DevOps pipelines, or background job processing.

    How the Five Fields Work

    A standard cron expression consists of five fields separated by spaces. From left to right, they control the minute, hour, day of the month, month, and day of the week. Each field accepts specific values: minutes range from 0 to 59, hours from 0 to 23 (in 24-hour format), days of the month from 1 to 31, months from 1 to 12 (or their three-letter abbreviations like jan and dec), and days of the week from 0 to 6 where 0 is Sunday. You can also use the asterisk * as a wildcard that means "every value" in that field, so * in the minute field triggers on every minute of every hour.

    Beyond simple values, cron supports several powerful operators. A comma creates a list of specific values — for example, 1,15 in the day-of-month field runs on the 1st and 15th of each month. A hyphen defines a range, so 1-5 in the day-of-week field covers Monday through Friday. The slash operator creates a step or interval — */10 in the minute field means "every 10 minutes" starting from minute 0, producing runs at minutes 0, 10, 20, 30, 40, and 50. These operators can be combined in many ways, but keep in mind that ranges with steps like 1-30/5 start at 1 and increment by 5, yielding 1, 6, 11, 16, 21, and 26. Understanding these building blocks lets you compose virtually any schedule you need.

    The five fields are evaluated together, not independently. A cron daemon checks each field in sequence, and only when all five match the current time does the job run. This means you can create very specific schedules by combining constraints. For example, 0 9 1,15 * * runs at 9:00 AM on both the 1st and 15th of every month. But if you set 0 0 31 * *, the job will only run in months that actually have 31 days — in months with 28 or 30 days, that expression will never fire. This is a common source of confusion and a good reason to double-check your expressions carefully.

    Common Cron Patterns and Use Cases

    Certain cron patterns appear again and again in real-world systems. Running a task every minute with * * * * * is useful for health checks, cache warming, or polling external APIs for changes. The pattern */5 * * * * — every five minutes — is the default interval for many monitoring and data-sync workflows. For hourly tasks like log rotation or metrics aggregation, use 0 * * * * which fires exactly once per hour at minute zero. Daily backups at 2:00 AM are commonly expressed as 0 2 * * *, scheduling the job during low-traffic hours to minimize impact on production systems.

    Weekly schedules are equally straightforward. 0 0 * * 0 runs every Sunday at midnight, making it ideal for weekly reports or database maintenance windows. The expression 0 9 * * 1-5 fires at 9:00 AM on every weekday, which is perfect for business-hours tasks like sending Slack reminders, syncing CRM data, or triggering deployment pipelines. For monthly jobs, 0 0 1 * * targets the first day of every month, useful for billing cycles, invoice generation, or monthly archive creation. You can refine monthly schedules further with expressions like 0 0 1,15 * * to run twice a month.

    More complex patterns serve specialized needs. 0 22 * * 1-5 runs every weekday at 10:00 PM, which is great for end-of-day data processing. 30 3 1,15 * * fires at 3:30 AM on the 1st and 15th of each month — a common pattern for bi-monthly compliance checks or financial reconciliation. During daylight saving time transitions, remember that cron expressions follow your system's local time, so a job set for 2:00 AM may run twice or not at all on the transition day. If your system requires UTC-based scheduling to avoid this ambiguity, make sure your server timezone is configured correctly or use an environment that explicitly supports UTC cron scheduling.

    Tips for Debugging Cron Expressions

    When a cron expression is not firing as expected, start by reading it aloud from left to right, translating each field into plain English. Ask yourself: does the minute value actually match the times I expect? Is the hour field using 24-hour format? Did I accidentally restrict the day-of-month or day-of-week fields in a way that creates an impossible combination? Many "bugs" in cron are actually misunderstandings about what a field means. The tool on this page helps by generating a human-readable description and showing the next five scheduled runs — use those previews to verify your intent before deploying an expression to production.

    A common pitfall is the interaction between day-of-month and day-of-week fields. When both fields are set to specific values rather than wildcards, most cron implementations require both conditions to be true simultaneously. For instance, 0 0 15 * 3 would only fire on the 15th of a month that also falls on a Wednesday. If you meant "run on the 15th of every month OR every Wednesday," you need two separate cron entries. Another frequent issue is off-by-one errors with ranges: 0 9 * * 1-5 runs Monday through Friday, but 0 9 * * 0-6 runs every day because 0 is Sunday and 6 is Saturday. Always verify whether your system treats Sunday as 0 or 7.

    When troubleshooting, check your system logs. On Linux, the cron daemon typically logs to /var/log/cron or /var/log/syslog depending on your distribution. Look for entries that show when the cron daemon evaluated your job and whether it decided to run it. If the job runs but fails, the problem is likely in your script, not the schedule — check that all paths are absolute, that environment variables are set explicitly in the cron entry (since cron runs with a minimal environment), and that file permissions allow execution. Many "cron is not working" reports turn out to be missing PATH entries or scripts that rely on shell aliases that do not exist in the cron environment.

    Finally, test your expressions before putting them into production. Use the preview feature on this page to confirm the next five run times match your expectations. If you have access to a Linux machine, you can also use tools like crontab -e to test expressions and crontab -l to list active entries. Some modern cron replacements like cronie support extended syntax or stricter validation that can catch errors early. The best debugging habit is to always ask: "What times will this actually fire?" rather than assuming your expression does what you think it does. A few seconds of verification saves hours of wondering why a job never ran.

    Your input is processed locally and isn't uploaded for processing. Verify by opening DevTools → Network — there are no requests carrying your data.

    Cron Generator examples.

    // Every minute

    * * * * *

    // Every 5 minutes

    */5 * * * *

    // Every 15 minutes

    */15 * * * *

    // Every hour

    0 * * * *

    // Every day at midnight

    0 0 * * *

    // Every day at 9am

    0 9 * * *

    // Every weekday at 9am

    0 9 * * 1-5

    // Every Monday

    0 0 * * 1

    // First of every month

    0 0 1 * *

    // Every Sunday at noon

    0 12 * * 0

    Frequently asked questions.

    What is cron?

    Cron is a job scheduler used by Unix-like systems. A cron expression is five fields: minute, hour, day-of-month, month, and day-of-week.

    Are all cron implementations the same?

    No. This generator uses the standard 5-field syntax. Some systems (Quartz, AWS EventBridge, Kubernetes CronJob) use 6 or 7 fields — those are not the focus of this tool.

    Is my expression stored anywhere?

    No. The expression lives only in your browser.

    How do I run a cron job every 5 minutes?

    Use the expression "*/5 * * * *" — the */5 in the minute field means "every 5 minutes starting at minute 0".

    What does 0 9 * * 1-5 mean?

    At 09:00, Monday through Friday. The 1-5 in the day-of-week field is a range from Monday (1) to Friday (5).

    Related tools.