Cron Expression Generator
Build cron expressions visually, get a plain-English description, and preview the next 5 firing times. Supports ranges, lists, steps, and shortcuts (@hourly, @daily, @weekly).
every 5 minutes
*/5
minute
(0–59)
*
hour
(0–23)
*
day of month
(1–31)
*
month
(1–12)
*
day of week
(0–6)
Common presets
Next 5 firing times (local time)
| # | Date / Time | In |
|---|---|---|
| 1 | 4/30/2026, 8:35:00 AM | 3m |
| 2 | 4/30/2026, 8:40:00 AM | 8m |
| 3 | 4/30/2026, 8:45:00 AM | 13m |
| 4 | 4/30/2026, 8:50:00 AM | 18m |
| 5 | 4/30/2026, 8:55:00 AM | 23m |
About Cron Expressions
Cron is the time-based job scheduler that has powered Unix systems since 1975. Its expression syntax — five space-separated fields describing minute, hour, day-of-month, month, and day-of-week — is one of the most widely-deployed mini-languages in computing. It is used by Linux crontab, systemd timers, GitHub Actions, GitLab CI, Kubernetes CronJobs, AWS EventBridge, Azure Functions, and dozens of application schedulers.
Cron Syntax Quick Reference
* * * * *
│ │ │ │ └── day of week (0–6, Sun=0, or SUN-SAT)
│ │ │ └───── month (1–12, or JAN-DEC)
│ │ └──────── day of month (1–31)
│ └─────────── hour (0–23)
└────────────── minute (0–59)
Operators
* any value
, value list separator (e.g. 1,15,30)
- range (e.g. 9-17)
/ step (e.g. */15)Common Patterns
*/5 * * * *— every 5 minutes (00:00, 00:05, 00:10, …)0 9 * * 1-5— every weekday at 09:000 */6 * * *— every 6 hours (00:00, 06:00, 12:00, 18:00)15 14 1 * *— 14:15 on the 1st of every month0 22 * * 1-5— weekdays at 22:00 (nightly batch)0 0 1,15 * *— midnight on the 1st and 15th of each month@reboot— once at system startup (Vixie cron only)
The Day-of-Month / Day-of-Week Trap
The single most common cron bug is misunderstanding how day-of-month (DOM) and day-of-week (DOW) interact. In Vixie cron (the standard implementation on Linux and BSD), if both fields are restricted, the job fires when either matches — an OR, not an AND. So 0 0 1 * 1 fires on the 1st of every month and every Monday, totaling roughly 16 firings per month, not 1. To run on the 1st only when it falls on a Monday, leave one field as * and add a guard inside your job, or switch to a scheduler with stricter semantics like Quartz or systemd timers.
Time Zones and DST
Vixie cron uses the system time zone. On most servers this is UTC, but on workstations it is local time. Daylight saving transitions can cause a job scheduled at 02:30 to either run twice (when clocks fall back) or skip entirely (when clocks spring forward). Modern schedulers handle this differently:
- Kubernetes CronJob defaults to UTC; supports a
timeZonefield since v1.27. - AWS EventBridge schedules use UTC; rate expressions are timezone-independent.
- GitHub Actions schedules are UTC and may run with up to a 60-minute delay during heavy load.
- Vixie cron on Linux uses
/etc/localtime, configurable with theTZvariable in the crontab.
Operational Tips
Always preview the next firing times before deploying a new cron expression — a single misplaced asterisk can turn a daily job into one that runs every minute, generating thousands of unintended invocations. Add jitter for jobs that hit external services to avoid thundering-herd problems: instead of 0 * * * * (everyone fires at :00), pick a random offset like 17 * * * *. Make jobs idempotent so a missed or duplicated run does not corrupt data — many schedulers do not guarantee exactly-once execution.
Log and monitor every cron run, including no-op runs. A silent cron failure can go undetected for weeks. Use a heartbeat service like Cronitor, Healthchecks.io, or a self-hosted "dead man's switch" that pages you when a scheduled run doesn't check in. Avoid overlapping runs with file locks (flock) when a long-running job fires on a tight schedule — otherwise two instances can clobber each other's state.
Frequently Asked Questions
What is a cron expression?
A cron expression is a 5-field string used by Unix cron and most modern schedulers (GitHub Actions, Kubernetes CronJobs, AWS EventBridge, Azure Functions) to describe when a job should run. The fields are minute, hour, day-of-month, month, and day-of-week. Each field accepts a number, range, list, step value, asterisk wildcard, or named alias.
What does each cron field mean?
Position 1: minute (0–59). Position 2: hour (0–23, 24-hour clock). Position 3: day of month (1–31). Position 4: month (1–12, or JAN–DEC). Position 5: day of week (0–6, where Sunday=0, or SUN–SAT). An asterisk means every value, a slash introduces a step (every N), a hyphen marks a range, and a comma separates a list of values.
How do day-of-month and day-of-week interact?
In standard Vixie cron, when both day-of-month AND day-of-week are set to specific values (not *), the job fires when EITHER matches, not both. So "0 0 1 * 1" fires on the first of every month AND every Monday. This trips up many users — to fire only when a specific day-of-month falls on a specific weekday, use a guard inside your job or a scheduler with stricter semantics.
What are @hourly, @daily, @weekly, @monthly?
These are convenience aliases supported by Vixie cron and most modern schedulers. @hourly = 0 * * * *, @daily = 0 0 * * *, @weekly = 0 0 * * 0, @monthly = 0 0 1 * *, @yearly = 0 0 1 1 *. They are easier to read but identical in behavior to the equivalent 5-field expression.
What time zone does cron use?
Traditional Vixie cron uses the system time zone, which is usually UTC on servers but local time on workstations. Modern schedulers like Kubernetes CronJob, AWS EventBridge, and GitHub Actions default to UTC, sometimes with an explicit timezone field. The next-run preview here uses your browser local time. Always confirm your scheduler’s timezone — the same expression can fire 6+ hours apart depending on where it runs.
Are seconds supported in cron?
Standard Vixie cron has no seconds field — the minimum granularity is one minute. Some flavors (Quartz, Spring Scheduler, node-cron) extend the syntax with a 6th leading seconds field. This generator outputs the standard 5-field format, which works on Linux crontab, Kubernetes CronJob, GitHub Actions workflows, and AWS EventBridge schedules.
How do I run a job every N minutes?
Use a step expression in the minute field. */5 * * * * runs every 5 minutes (at :00, :05, :10, …). */15 * * * * runs every 15 minutes. To start the cycle on a specific minute, use a range with a step: 7-59/10 * * * * fires at :07, :17, :27, etc. Steps must divide evenly to fire at consistent intervals.