Free cron expression explainer
Paste a cron expression and this explainer translates it into plain English — turning a line like 0 9 * * 1-5 into '9:00 AM, Monday–Friday' — and lists the next run times, updated live, as you type.
On this page12 sections
Output is generated client-side in your browser. No data is transmitted to any server.
Results are estimates. Consult a professional.
What a cron expression is and what this tool does
A cron expression is a short string of five fields that tells a scheduler when to run a job — once a minute, every weekday at 9 AM, at midnight on the first of the month, and almost any pattern in between. The syntax is terse on purpose: a line like 0 9 * * 1-5 packs a whole weekly schedule into nine characters. The trade-off is that it is hard to read at a glance, which is exactly the problem this cron expression explainer solves.
Paste an expression above and the tool does two things. First it translates the schedule into plain English — 0 9 * * 1-5 becomes "at 9:00 AM, Monday through Friday." Then it lists the next run times so you can confirm the schedule fires when you expect. Nothing is scheduled and no job is run; the tool only reads and describes the expression, updated live as you type.
The 5-field cron expression structure
A standard cron expression is five fields separated by single spaces, read left to right: minute, hour, day of month, month, and day of week. Each field accepts a number within its own range, or one of the special characters in the next section. The expression matches when the current time satisfies every field at once.
| Position | Field | Allowed values | Also accepts |
|---|---|---|---|
| 1 | Minute | 0–59 | * , - / |
| 2 | Hour | 0–23 | * , - / |
| 3 | Day of month | 1–31 | * , - / (L W ?) |
| 4 | Month | 1–12 | * , - / and JAN–DEC names |
| 5 | Day of week | 0–6 (Sun=0) | * , - / and SUN–SAT names (# L ?) |
Field order and ranges per the POSIX crontab specification. Parenthesised characters (L, W, #, ?) are extensions found in Quartz and some other schedulers, not in standard Unix cron.
The five fields, their ranges, and the rule that the day-of-month and day-of-week fields are treated as a logical OR are defined in the POSIX crontab specification (IEEE Std 1003.1, "crontab").Cron special characters: * , - and /
Four characters do almost all the work in a cron expression. They let one field stand for "any value," a list of values, a continuous range, or a repeating step. Learn these four and you can read the large majority of schedules you will meet.
| Character | Name | Means | Example |
|---|---|---|---|
| * | Asterisk | Every value in the field | * in the hour field = every hour |
| , | Comma | A list of specific values | 0,30 in minutes = at :00 and :30 |
| - | Hyphen | An inclusive range | 1-5 in day-of-week = Mon–Fri |
| / | Slash | A step within a range or * | */15 in minutes = every 15 minutes |
The four portable special characters defined for standard Unix cron. They can be combined — for example 0-30/10 means 0, 10, 20, 30.
Some schedulers add more. The question mark ? means "no specific value" and is used in Quartz to resolve the day-of-month / day-of-week clash (you set one field and put ? in the other). L means "last" — the last day of the month, or the last given weekday. W means the nearest weekday to a date, and # picks the nth weekday of the month (6#2 = the second occurrence, where the weekday number follows that scheduler's own day-of-week numbering — in Quartz, where Sunday = 1, 6 is Friday). These are extensions, not part of standard cron, so confirm your scheduler supports them before relying on them.
Cron expression examples, decoded
Take the common "weekday morning" schedule 0 9 * * 1-5 and read it field by field, the way the tool does.
Read each field left to right
- Minute = 0 — at the top of the hour.
- Hour = 9 — the 9 o'clock hour, so 9:00.
- Day of month = * — any day of the month.
- Month = * — every month.
- Day of week = 1-5 — Monday through Friday (1=Mon … 5=Fri).
Put together, the tool reports at 9:00 AM, Monday through Friday — and lists the next several weekday mornings as the upcoming run times.
Two more you will see constantly
*/15 * * * * uses a step in the minute field: minute = every 15 (0, 15, 30, 45), every hour, every day — so every 15 minutes. And 0 0 1 * * sets minute 0, hour 0 and day-of-month 1, which is midnight on the 1st of every month — a classic monthly billing or report job.
Common cron schedules reference table
Most real jobs reuse a handful of patterns. This table maps the expressions you will write most often to what they mean, so you can copy a starting point and adjust one field.
| Expression | Runs |
|---|---|
| * * * * * | Every minute |
| */5 * * * * | Every 5 minutes |
| */15 * * * * | Every 15 minutes |
| 0 * * * * | Every hour, on the hour |
| 0 0 * * * | Every day at midnight |
| 0 9 * * 1-5 | 9:00 AM, Monday–Friday |
| 0 0 * * 0 | Midnight every Sunday |
| 0 0 1 * * | Midnight on the 1st of every month |
| 0 0 1 1 * | Midnight on 1 January (yearly) |
| 30 2 * * 6 | 2:30 AM every Saturday |
Standard 5-field cron. In the day-of-week column, 0 = Sunday and 1–5 = Monday–Friday, per the POSIX crontab field ranges.
What cron expressions are used for
Cron is the default way to say "run this on a schedule" across the software world. Anywhere a task needs to repeat on a clock rather than in response to an event, a cron expression usually defines the timing.
- Cron jobs on servers — the original use: the Unix
crondaemon reads a crontab and runs backups, log rotation, cache warming and maintenance scripts on schedule. - Scheduled tasks in apps — frameworks such as Spring, Quartz, Celery, Kubernetes CronJobs and serverless platforms accept cron expressions to fire background work, emails and report generation.
- CI/CD pipelines — GitHub Actions, GitLab CI and Jenkins use cron syntax to run nightly builds, scheduled tests and dependency scans (for example
0 0 * * *for a nightly job). - Data and billing jobs — hourly syncs, daily ETL runs and monthly invoicing (
0 0 1 * *) are all expressed as cron schedules.
If you are wiring up other parts of a job — encoding a token, generating an ID for the run, or testing a pattern that parses its output — the rest of our developer tools, including the regex tester, sit alongside this one.
Cron gotchas: day-of-week, time zones, and 6-field syntax
Cron is simple until three things trip you up. Each one is a source of jobs that silently run too often, at the wrong time, or not at all — so they are worth understanding before you trust a schedule in production.
Day-of-month and day-of-week are OR, not AND
This is the classic surprise. When both the day-of-month and the day-of-week fields are restricted (neither is *), standard cron fires when either matches, not only when both do. So 0 0 13 * 5 runs at midnight on the 13th of the month and on every Friday — not only on Friday the 13th. To pin a single condition, leave the other field as *.
Time zone — cron runs in the server's clock
An expression has no time zone of its own. Classic Unix cron runs in the system's local time, while many cloud schedulers (GitHub Actions, AWS EventBridge) run in UTC. The same 0 9 * * * fires at 9 AM in whatever zone the scheduler uses — which may not be your 9 AM. Daylight-saving shifts can also make a daily job run twice or skip a run. Always confirm the scheduler's zone, and prefer UTC for jobs that must not drift.
5-field cron vs 6-field (seconds) syntax
Standard Unix cron has five fields and the smallest unit is one minute. Quartz, Spring and some others add a leading seconds field for six, and Quartz also numbers the days of the week 1–7 (Sunday = 1) instead of 0–6. Paste a 6-field Quartz expression into a 5-field parser and every field shifts by one — so this tool reads the standard 5-field form. If your scheduler expects seconds, account for the extra field.
How accurate is this cron expression explainer?
The parsing is exact for standard 5-field cron. The tool reads each field against the POSIX ranges — minute 0–59, hour 0–23, day of month 1–31, month 1–12, day of week 0–6 — expands the special characters * , - and /, and describes the resulting schedule. The next-run times are computed by stepping the clock forward and testing the same fields, so the English description and the upcoming runs always agree.
What it cannot know is your scheduler's variant and clock. It explains the standard 5-field form in the scheduler's own time zone; it does not assume UTC, parse a 6-field Quartz expression, or model daylight-saving edge cases. Treat the plain-English reading as the meaning of the expression, then confirm the field count, day-of-week base, and time zone against your scheduler's documentation. For another browser-based dev utility, see our regex tester.
Field definitions, ranges, and the day-of-month / day-of-week OR rule follow the POSIX crontab specification (The Open Group Base Specifications, "crontab").Frequently asked questions about the free cron expression explainer
About this Cron Expression explainer
This cron expression explainer runs entirely in your browser — the expression you type is never sent anywhere or stored. It parses the standard 5-field syntax (minute, hour, day of month, month, day of week), translates it to plain English, and lists the next run times the moment you change a field. It reads the schedule only; it never installs a crontab or runs a job.
It is one of our free developer tools; browse the full set on the calculators index.