Validate any CRON expression instantly — get a plain-English description, a color-coded field breakdown, and a preview of the next scheduled run times.
A CRON expression is a compact string used by the cron daemon (and many modern schedulers) to specify recurring time-based schedules. Originating in Unix systems in the 1970s, the format is now used universally — in Linux servers, Kubernetes CronJobs, AWS EventBridge, GitHub Actions schedules, Jenkins, GitLab CI, and countless application-level task schedulers.
A standard CRON expression has five fields, separated by spaces:
┌───── Minute (0–59)
│ ┌─── Hour (0–23)
│ │ ┌─ Day (1–31)
│ │ │ ┌ Month (1–12 or JAN–DEC)
│ │ │ │ ┌ Weekday (0–6 or SUN–SAT, 0 = Sunday)
│ │ │ │ │
* * * * *
The Quartz Scheduler (Java) and frameworks like Spring use a six-field variant that prepends a Second field (0–59), allowing sub-minute precision.
| Character | Meaning | Example | Result |
|---|---|---|---|
| * | Every value in the range | * * * * * | Every minute |
| */n | Every n-th value (step) | */15 * * * * | Every 15 minutes |
| n-m | Inclusive range | 0 9-17 * * * | Every hour from 9 AM to 5 PM |
| n,m | List of values | 0 0 * * 1,3,5 | Mon, Wed, Fri at midnight |
| n-m/s | Range with step | 0-30/5 * * * * | Minutes 0,5,10,15,20,25,30 |
| ? | Any value (Quartz only — same as *) | 0 0 ? * 1 | Every Monday at midnight |
| Expression | Description |
|---|---|
| * * * * * | Every minute |
| */5 * * * * | Every 5 minutes |
| 0 * * * * | Every hour (at the top of the hour) |
| 0 */6 * * * | Every 6 hours |
| 0 0 * * * | Every day at midnight |
| 0 9 * * 1-5 | Every weekday at 9:00 AM |
| 0 0 * * 0 | Every Sunday at midnight |
| 0 0 1 * * | First day of every month at midnight |
| 0 0 1 1 * | January 1st at midnight |
| */30 9-17 * * 1-5 | Every 30 min during business hours on weekdays |
The day-of-month and day-of-week fields have a special relationship. According to the POSIX standard:
*), the restricted field determines when the job runs.0 0 1 * 1 runs on the 1st of every month and also every Monday.This OR behavior surprises many developers. If you intend AND logic (run on Mondays that fall on the 1st), you need to handle that in your script logic, not the CRON expression.
The Quartz Scheduler (used in Java/Spring applications) adds a second field at the beginning, enabling second-level precision. AWS EventBridge and some cloud schedulers also support a 6-field format. Key differences:
1–7 where 1 = Sunday (vs. 0–6 in standard CRON).? character is required when both day-of-month and day-of-week are specified — you must use ? for the one you don't want to constrain.crontab does not support 6-field expressions.Run a backup script once per day during low-traffic hours.
0 2 * * *
Explanation: At minute 0 of hour 2, every day, every month, every weekday.
Runs: 2026-05-17 02:00, 2026-05-18 02:00, 2026-05-19 02:00…
Ping a service endpoint and alert if it is down.
*/5 * * * *
Explanation: Every 5 minutes, all day, all week.
Runs: :00, :05, :10, :15, :20, :25, :30, :35, :40, :45, :50, :55
Generate and email a weekly summary to stakeholders.
0 8 * * 1
Explanation: At 8:00 AM every Monday.
Named equivalent: 0 8 * * MON
The most common causes are: (1) the server timezone differs from your expectation — CRON uses the system timezone, not UTC; (2) the expression uses OR logic for day-of-month and day-of-week when you expect AND; (3) the task itself runs but produces an error — check system mail or redirect output to a log file.
Standard 5-field CRON has a minimum granularity of 1 minute. If you need sub-minute intervals, use 6-field Quartz/Spring CRON, or use a loop inside your script (e.g., sleep 30 between executions within a minutely cron job). Cloud schedulers like AWS EventBridge support 1-minute minimum in 5-field mode.
? means "no specific value" and is used in the Quartz scheduler when you want to specify one of the day fields without constraining the other. Since you can't say "on the 15th AND on Wednesday" simultaneously, you use ? for the unconstrained field. For example: 0 0 15 * ? = "at midnight on the 15th of every month, any weekday".
In standard CRON, both 0 and 7 equal Sunday. Most implementations accept either. Monday is 1, Tuesday is 2, and so on through Saturday = 6. You can also use the named equivalents: SUN, MON, TUE, WED, THU, FRI, SAT. In Quartz, the numbering shifts: 1 = Sunday, 2 = Monday, … 7 = Saturday.
Standard CRON has no built-in "last day of month" symbol. Common workarounds: (1) use 28-31 in the day field combined with a script-level check; (2) in Quartz, use the special L character (0 0 L * ?); (3) schedule for the 1st of the month and process the previous month's data instead.
*/5 in the minute field means "every 5 minutes" (0, 5, 10, 15… 55). 5 alone means "only at minute 5" — so 5 * * * * runs once per hour at :05, not every 5 minutes. A common mistake is writing 5 * * * * when the intention is */5 * * * *.
The parser iterates forward from the current time in 1-minute (or 1-second for 6-field) increments, checking each candidate timestamp against all five fields. This brute-force approach is simple and correct for all valid expressions, including complex combinations of ranges, steps, and lists. All computation runs locally in your browser — no data is sent to a server.
Yes. Most CRON implementations (and this parser) accept the first three letters of the month name (JAN, FEB, MAR… DEC) and weekday name (SUN, MON, TUE… SAT). You can mix numeric and named values in the same expression: 0 9 * JAN-MAR 1-5 runs weekdays at 9 AM during the first quarter of the year.