Cron Expression Parser
Parse and explain cron expressions in plain English. Validate cron syntax and preview the next 10 scheduled run times. Free, browser-based.
- Runs in your browser
- Your data never leaves your browser
- Free · No Sign-Up
Scan with WeChat to share this tool
Examples, details and FAQ Worked examples, how it compares with other tools, and answers to common questions.
Examples
The descriptions below are what the tool prints. The run times were computed by the tool’s own function starting from 2026-10-01 08:00 with the clock set to UTC; your list starts from the current minute.
| Expression | Description | First runs |
|---|---|---|
0 9 * * 1-5 | At 9:00, on mon through fri | Oct 1 09:00, Oct 2 09:00, Oct 5 09:00 |
*/15 9-17 * * mon-fri | At every 15 minutes past 9 through 17, on mon, tue, wed, thu, fri | Oct 1 09:00, 09:15, 09:30 |
30 2 1,15 * * | At 2:30, on day 1, 15 of the month | Oct 15 02:30, Nov 1 02:30, Nov 15 02:30 |
0 0 1 * 1 | At midnight, on day 1 of the month or on mon | Oct 5, Oct 12, Oct 19 (00:00) |
0 0 29 2 * | At midnight, on day 29 of the month, in feb | 2028-02-29, 2032-02-29, 2036-02-29 |
In the second row the last run of each day is 17:45, not 17:00: the hour field 9-17 includes hour 17, and the
minute field fires four times within it. To stop at 17:00, write the schedule as two lines (*/15 9-16 * * 1-5 and
0 17 * * 1-5). A few inputs and the message they give:
0 0 * * * *(six fields, as in Spring or Quartz) →Invalid: expected 5 fields, got 6.0 24 * * *→Invalid expression — check each field range.Hours run 0–23.5/10 * * * *→ the step error that suggests*/10or5-59/10.0 0 30 2 *→ the expression is valid, but no run time is found:No run time found: no real date matches these fields (for example, February 30).
Cron Field Reference
| Field | Allowed values | Special characters |
|---|---|---|
| Minute | 0–59 | * , - / |
| Hour | 0–23 | * , - / |
| Day of month | 1–31 | * , - / |
| Month | 1–12 or jan–dec | * , - / |
| Day of week | 0–7 (0 and 7 = Sunday) or sun–sat | * , - / |
Day of Month and Day of Week
When both day fields are restricted, a day that matches either one runs (cronie crontab(5), POSIX crontab): 0 0 1 * 1 runs on the 1st of every month and on every Monday. If either field starts with *, */2 included, both must match, as in cronie, so 0 0 */2 * 1 runs only on Mondays with an odd date. The month field always has to match.
Next run times are found however far ahead they are: 0 0 1 1 * lists January 1 of the next ten years, and 0 0 29 2 * lists February 29 of leap years. For a date that never exists, such as 0 0 30 2 *, the tool says that no run time was found.
Unsupported Syntax
# (nth weekday, as in 1#2 for the second Monday), L (last), W (nearest weekday) and ? come from Quartz and similar schedulers; standard cron does not accept them. The tool does not guess a schedule for them: it shows an error that names the part and the field, for example “1#2” in the weekday field. Values that are not plain numbers or names, such as 1.5 or monday, are also rejected. A step must follow * or a range: cronie rejects 5/10, and so does this tool; write 5-59/10 or */10.
Limits
- Local time only. Run times use the browser’s time zone. There is no time zone selector, and a
CRON_TZ=line is not read; cronie usesCRON_TZfor the whole crontab. - Daylight saving time. Times that do not exist when clocks go forward never match, as crontab(5) states. Times that occur twice when clocks go back are listed once, although cronie runs the job twice.
- English description. The plain-English sentence is generated in English on every language version of this page; field names and messages are translated.
- No @ macros.
@daily,@hourly,@rebootand the other shortcuts are reported as the wrong number of fields. Write the five-field form:@dailyis0 0 * * *. - Ten runs. The list always stops at ten; there is no “show more” or date picker.
Same Syntax, Different Schedulers
Five-field cron is shared by many systems, but they differ around the edges. GitHub Actions
runs schedule workflows in UTC unless a time zone is set, never more often than every 5 minutes, and may delay runs at the start of
the hour under high load. A Kubernetes CronJob
accepts the @ macros and treats ? like *, which this tool rejects; set its time zone in .spec.timeZone, because
CRON_TZ inside the schedule fails validation. If you need to build an expression rather than read one, the
cron job generator writes it from form fields.
FAQ
What is a cron expression?
A cron expression is a string with 5 fields (minute, hour, day-of-month, month, day-of-week) that defines a recurring schedule. It is used by cron, crontab, Kubernetes, GitHub Actions, and many other systems.
What does * mean in a cron expression?
An asterisk (*) means 'every valid value'. For example, * in the minute field means 'every minute'. Combined with other fields it creates intervals.
What is the difference between '0 0 * * 0' and '0 0 * * 7'?
Both mean Sunday midnight. The day-of-week field accepts 0 and 7 as aliases for Sunday.
Does this support seconds or @reboot?
This tool supports the standard 5-field cron format (minute hour day month weekday). 6-field cron with seconds, @reboot and other @ shortcuts are not supported, and the Quartz-style characters #, L, W and ? give an error that names the unsupported part.
Can I paste a schedule from a GitHub Actions workflow?
Usually yes: GitHub Actions uses the same five fields. Two things differ. GitHub runs the schedule in UTC unless the workflow sets a timezone, while this tool lists runs in your browser's time zone. And GitHub's documentation shows 20/15 * * * * (minutes 20, 35 and 50); this tool follows cronie, which rejects a step after a single number, so write 20-59/15 instead.
Is my cron expression sent anywhere or saved?
No. The expression is parsed by the page's script in your browser tab; it is not sent to a server and not written to browser storage. The page's analytics records a usage event with the tool name and the action (Parse, Enter or a preset), not the expression.