Cron Expression Generator — Build & Explain Cron Schedules
Build a cron schedule from dropdowns or paste one, read it in plain English, and see the next 10 run times in your zone and UTC. Free, in your browser.
minute · hour · day of month · month · day of week. Names (JAN, MON), @daily-style macros and a whole pasted crontab line are accepted.
Uses a range or step (1-5); edit it in the expression box, or pick values below to replace it.
…
Cron reads the schedule in the zone of the machine it runs on. Pick “UTC” for GitHub Actions, Vercel, most CI runners and cloud schedulers; both columns show the same moments.
Paste the output of crontab -l. Comments and VAR=value lines are skipped.
| At every 5th minute. /usr/local/bin/healthcheck.sh | |
| At 02:30. /usr/local/bin/backup.sh --full | |
| At 09:00 on every day-of-week from Monday through Friday. php /var/www/artisan reports:send | |
| At 00:00 on Sunday. certbot renew --quiet |
| Poll an API or queue every 10 minutes | |
| Every 6 hours (00:00, 06:00, 12:00, 18:00) | |
| Nightly backup at 02:30 | |
| Every hour during office hours, weekdays | |
| Every 30 minutes during office hours | |
| Weekly, Sunday at midnight (same as @weekly) | |
| Twice a month: the 1st and 15th at 08:00 | |
| Last days of the month (check for tomorrow = 1st in the script) | |
| Saturday 03:00 maintenance window | |
| Quarterly, 04:15 on the 1st of Jan, Apr, Jul, Oct | |
| Friday OR the 13th (the OR rule in action) | |
| Macro: once a day at midnight |
Runs entirely in your browser. Nothing you enter is sent to us or stored. Browse all free tools.
Found a problem, or something that could be better? We read every message and we fix things quickly.
This free cron expression generator builds a five-field cron schedule from dropdowns and reads any expression back in plain English, with the next ten run times listed in your time zone and in UTC. Paste an expression, a crontab line or a whole crontab and every schedule is explained. It understands the standard syntax shared by crontab, GitHub Actions, Kubernetes CronJob, Vercel cron and most schedulers: asterisks, lists, ranges, steps, month and weekday names, and the @daily-style macros.
Cron syntax is compact and unforgiving: “0 0 1 * *” and “0 0 * * 1” look alike and mean the first of every month versus every Monday. Seeing the schedule in words and as concrete dates is the difference between a job that runs at 9:00 on weekdays and one that runs at 09:00 UTC on Sunday, which is the mistake this page exists to prevent. The calculator follows Vixie cron exactly, including its quirk that a day field starting with an asterisk changes how the two day fields combine. It does not accept Quartz syntax (a seconds field, L, W, #) and says so when you paste it.
How to use
- Start from a preset or an example, or type or paste an expression (a full crontab line is trimmed to its schedule). The English description and next runs update as you edit.
- Use the five field editors to set minute, hour, day of month, month and day of week: every, every N, or specific values.
- Check the next ten runs. Choose “UTC” if the job will run on a server or CI runner, which almost always uses UTC; each run is shown in both your zone and UTC.
- To audit an existing server, paste the output of crontab -l into “Explain a whole crontab”.
- Copy the expression, or copy a complete crontab line with the description as a comment.
- Paste it into crontab -e, a GitHub Actions schedule: block, a Kubernetes CronJob spec, or your platform's cron settings.
Frequently asked questions
What do the five fields mean?
In order: 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, where both 0 and 7 are Sunday). An asterisk means every value; 1-5 is a range; 1,15 is a list; */10 means every tenth value.
What happens when both day of month and day of week are set?
Standard (Vixie) cron runs the job when either matches, not both. “0 0 13 * FRI” runs on the 13th of every month and on every Friday, not only on Friday the 13th. This page follows that rule. One subtlety: if either day field starts with an asterisk (for example */2), Vixie cron treats it as unrestricted and requires both to match, so “0 0 */2 * 1” means odd-numbered days that are Mondays. Quartz differs and uses a ? to mark the unused field.
Which time zone does cron use?
The zone of the machine or service running it. Personal servers usually use local time; cloud runners, GitHub Actions, Vercel and most Kubernetes clusters use UTC. A job set for 9:00 on a UTC runner fires at 5:00 in Toronto in summer and 4:00 in winter. The runs table shows every time in both your zone and UTC, so the shift is visible.
Does it support seconds or the L, W and # extensions?
No. Six-field (seconds) syntax and the L (last), W (weekday) and # (nth weekday) extensions belong to Quartz and some enterprise schedulers, not to standard cron, and most platforms reject them. If you need “last Friday of the month”, the portable approach is a job that runs every Friday and checks the date itself.
Why does my job never run?
Common causes: the schedule is valid but impossible (31 April, 30 February); the server is in a different time zone than you assumed; the crontab line has no command or the command's PATH differs from your shell; or the interval is shorter than the job's own runtime and instances pile up. The next-runs list here catches the first two.
Cron syntax reference
• * every value · 5 exactly 5 · 1-5 range · 1,3,5 list · */15 every 15th value · 1-30/5 every 5th value from 1 to 30
• Names: JAN–DEC for months, SUN–SAT for weekdays (case-insensitive); ranges of names work (MON-FRI).
• @hourly (0 * * * *), @daily or @midnight (0 0 * * *), @weekly (0 0 * * 0), @monthly (0 0 1 * *), @yearly or @annually (0 0 1 1 *); @reboot runs once at boot. Crontab accepts these, but not every platform does; the five-field form is the portable one.
• Day-of-week 0 and 7 are both Sunday. Ranges do not wrap: FRI-MON is an error; write FRI-SAT,SUN-MON or 5,6,0,1.
• Fields are separated by whitespace; the command follows on the same line in a crontab.
Where cron schedules go
Linux and macOS: crontab -e, one job per line, expression then command. GitHub Actions: on: schedule: - cron: '0 9 * * 1-5', always UTC, and runs may be delayed several minutes at busy times. Kubernetes: the schedule field of a CronJob. Vercel: vercel.json crons with a path and a schedule, UTC. Cloud schedulers (AWS EventBridge, Google Cloud Scheduler) accept the same syntax with small dialect differences, and EventBridge adds a year field.
How the next run times are calculated
The calculator walks forward one calendar day at a time from now. For each day it checks the month, then the day-of-month and day-of-week fields with the Vixie rule (OR when both are restricted, AND when either starts with *), and only then lists the matching hours and minutes. Runs that are not strictly after the current minute are skipped, so a job due this very minute is shown at its next occurrence.
In your own time zone, daylight saving time matters. A time that does not exist on the day clocks spring forward (02:30 in most of North America) is skipped, and a time that occurs twice when clocks fall back runs once. That is how cronie handles fixed-time jobs; other daemons can differ, which is one more reason servers usually run cron in UTC.
A schedule that names an impossible date (30 February, 31 April) never fires and the page says so. A 29 February schedule fires only in leap years; the search looks nine years ahead, enough for any real schedule.
Related free tools
- Regex Tester — Test a regular expression against sample text with live match highlighting, capture groups and replace preview. Free, in your browser.
- JSON Formatter — Pretty-print, minify and validate JSON, with parse errors located by line and column. In your browser, no upload.
- Unit Converter — Convert between every common unit — metric and imperial, cooking, data, pressure, energy, speed, fuel economy — instantly, in your browser.