What Is a Cron Expression?
A cron expression is a compact scheduling syntax originally created for the Unix cron daemon, the default job scheduler on Linux and macOS. Each expression encodes a repeating point in time — when should this job fire? — using five fields separated by spaces: minute, hour, day of month, month, and day of week. The daemon reads a user’s crontab file and executes the corresponding command whenever the system clock matches the pattern.
Cron expressions have since spread far beyond Unix. Kubernetes CronJobs, AWS EventBridge, GitHub Actions, Jenkins, Airflow, Spring @Scheduled, and Cloudflare Workers Cron Triggers all use the same core syntax (with minor extensions). If you learn the five-field format once, you can schedule jobs across nearly every platform.
How to Use This Cron Expression Builder
- Enter an expression directly in the input field — for example
0 9 * * 1-5— and the tool instantly shows a human-readable description, the next scheduled run times, and a breakdown of each field. - Or use the visual builder — select values for minute, hour, day, month, and weekday using the dropdowns. The expression is assembled and validated as you go.
- Read the next-run preview to confirm the schedule matches your intent before pasting it into your crontab, CI config, or orchestrator.
Everything runs client-side. No backend, no signup, no data leaves your machine.
Cron Expression Format
┌───────────── minute (0-59)
│ ┌───────────── hour (0-23)
│ │ ┌───────────── day of month (1-31)
│ │ │ ┌───────────── month (1-12 or JAN-DEC)
│ │ │ │ ┌───────────── day of week (0-7 or SUN-SAT, 0 and 7 = Sunday)
│ │ │ │ │
* * * * *
Each field accepts a single value, a range, a list, a step, or a wildcard — or a combination of these.
Special Characters
| Character | Meaning | Example | Description |
|---|---|---|---|
* | Any value | * * * * * | Every minute |
, | List | 1,15 * * * * | At minute 1 and minute 15 |
- | Range | 9-17 * * * * | Every minute from 9:00 through 17:59 |
/ | Step | */10 * * * * | Every 10 minutes starting at :00 |
L | Last (day) | 0 0 L * * | Last day of the month (non-standard) |
W | Nearest weekday | 0 0 15W * * | Nearest weekday to the 15th (non-standard) |
# | Nth weekday | 0 0 * * 5#3 | Third Friday of the month (non-standard) |
The L, W, and # operators are extensions supported by Quartz, Spring, and some cloud schedulers. Standard Unix cron does not recognize them.
Common Cron Expressions
| Expression | Description |
|---|---|
* * * * * | Every minute |
0 * * * * | Every hour at :00 |
0 0 * * * | Daily at midnight |
0 0 * * 0 | Every Sunday at midnight |
0 0 1 * * | First day of every month at midnight |
*/5 * * * * | Every 5 minutes |
0 9-17 * * 1-5 | Every hour from 9 AM to 5 PM, weekdays |
30 2 * * * | Daily at 2:30 AM |
0 0 1,15 * * | 1st and 15th of every month at midnight |
0 */6 * * * | Every 6 hours (midnight, 6 AM, noon, 6 PM) |
0 0 * * 1-5 | Every weekday at midnight |
0 8 * * 1 | Every Monday at 8 AM |
Cron Across Platforms
The five-field format is universal, but platforms extend it in different ways:
Linux / macOS crontab — the original five-field format. Supports @reboot, @hourly, @daily, @weekly, @monthly, and @yearly shorthand aliases. The timezone is the system timezone unless you set TZ= in the crontab.
AWS EventBridge (CloudWatch Events) — uses six fields: minute hour day-of-month month day-of-week year. The year field accepts * or a range like 2026-2028. Also supports rate(5 minutes) syntax for simple intervals.
Kubernetes CronJobs — standard five-field format. The timezone defaults to the kube-controller-manager timezone (usually UTC). Since Kubernetes 1.27 you can set .spec.timeZone explicitly.
GitHub Actions — five-field cron in the schedule trigger. Runs in UTC only — there is no timezone override. Schedules may be delayed under heavy load; they are best-effort, not guaranteed-precise.
Spring / Quartz (Java) — six fields with a seconds column prepended: second minute hour day month weekday. Supports L, W, #, and ? operators for more expressive scheduling.
Common Cron Mistakes and How to Fix Them
Timezone confusion. The single most common cron problem. Your server runs in UTC, you write 0 9 * * * thinking “9 AM my time,” and the job fires at the wrong hour. Always verify the timezone of the cron daemon. On Linux, run timedatectl or check /etc/timezone.
Day-of-month vs. day-of-week conflict. In standard cron, if you set both the day-of-month and day-of-week fields (neither is *), the job fires when either condition is true — it’s an OR, not an AND. 0 0 15 * 5 means “midnight on the 15th OR any Friday,” not “midnight on the 15th if it’s a Friday.” Some platforms (Quartz) use ? in one field to avoid this ambiguity.
Off-by-one in day-of-week. Sunday is 0 (or 7) in standard cron, but some systems use 1 for Monday and 7 for Sunday. Double-check your platform’s documentation if your weekend jobs fire on the wrong day.
Forgetting that */n starts from 0, not from now. */10 in the minute field fires at :00, :10, :20, :30, :40, :50 — not “every 10 minutes starting from when I saved the crontab.” If you add the entry at 9:03, the first run is still at 9:10.
Overlapping runs. If a job takes longer than its interval, cron starts a second instance. Use flock on Linux (flock -n /tmp/myjob.lock command) to prevent overlap, or set concurrency limits in your orchestrator.
Cron Builder vs. Other Tools
- This tool — zero-signup, instant validation with human-readable output and next-run preview. Privacy-first: nothing leaves your browser. Best for quickly building or debugging a cron expression.
- crontab.guru — focused expression explainer with a clean UI. Shows a plain-English translation and highlighted next-run dates. No visual builder for constructing expressions.
- Cron Maker — generates expressions through a form-based UI. Useful if you prefer clicking over typing, but supports fewer platform extensions.
- Your terminal —
crontab -eedits your live crontab directly. Fastest when you already know the syntax, but no validation or preview before saving.
Use this tool when you need to build an expression from scratch or verify one before deploying it.