Crontab Generator
Build and parse crontab expressions with a plain-English description and the next 10 run times in any timezone. Type a schedule or an expression — either way stays in sync.
0-59
0-23
1-31
1-12 or JAN-DEC
0-6 or SUN-SAT
Quick presets
At 09:00, on Monday-Friday
A crontab expression is five fields — minute, hour, day of month, month, day of week — that tell cron when to run a job. Each field can be a wildcard (*), a specific value, a comma list, a range, or a step, and getting the fifth field (day of week) to combine correctly with the third (day of month) trips up almost everyone at least once: when both are restricted, cron treats them as "either/or," not "and."
This tool works in both directions. Fill in the five fields (or leave * for "every"), and the combined expression, plain-English description, and next 10 run times update as you go — or paste an existing expression straight in and watch it decode into the fields, description, and schedule. Everything computes in your browser; nothing you type is sent anywhere.
How to use the crontab generator
- 1Fill in each field — Minute, Hour, Day of month, Month, Day of week — or leave * to mean "every." The combined Expression field updates to match.
- 2Already have an expression? Paste it into the Expression field instead — the five fields, description, and schedule all sync to match.
- 3Pick a timezone. Cron on a real server runs in that machine's local timezone (not UTC) unless it's configured otherwise, so set this to wherever the job actually runs to see accurate run times.
- 4Copy the expression, the plain-English description, or the full list of upcoming run times with one click.
Worked examples
| Expression | Runs | Typical use |
|---|---|---|
| */15 * * * * | Every 15 minutes | Health checks, polling a queue |
| 0 * * * * | Every hour, on the hour | Hourly log rotation |
| 0 0 * * * | Every day at midnight | Nightly backups |
| 0 9 * * 1-5 | 9:00 AM, Monday through Friday | Business-hours reports |
| 0 0 1 * * | Midnight on the 1st of every month | Monthly billing runs |
| 0 0 1 1 * | Midnight on January 1st | Yearly archive/cleanup jobs |
Frequently asked questions
What do the five fields in a crontab expression mean?+
In order: minute (0-59), hour (0-23), day of month (1-31), month (1-12 or JAN-DEC), and day of week (0-6 or SUN-SAT, where both 0 and 7 mean Sunday). A job runs whenever the current time matches all five fields — or, for day of month and day of week specifically, matches at least one of the two when both are restricted.
Why does my job run on days I didn't expect?+
This is almost always the day-of-month/day-of-week interaction. If you write "0 0 1 * 1" meaning "midnight on the 1st," cron actually reads it as "midnight on the 1st OR every Monday," because both fields are restricted and cron treats that as an OR, not an AND. To mean strictly "the 1st, and only if it's a Monday," you need extra logic outside cron itself — a plain crontab expression can't express that combination.
How do I run a job every N minutes or every N hours?+
Use a step value: */15 in the minute field runs every 15 minutes, and 0 */4 in minute+hour runs every 4 hours on the hour. A step doesn't have to start at zero either — 5/15 means "start at minute 5, then every 15 minutes" (5, 20, 35, 50).
Does the timezone here match my server's crontab?+
Only if you set it to match. A standard Linux crontab runs in the system's configured local timezone (check it with `timedatectl` or the TZ environment variable in the crontab file itself), not UTC, unless you've explicitly set one. Pick the same timezone here that your server actually uses to see accurate run times — otherwise the schedule shown won't match what actually fires.
What do @daily, @hourly, and similar shortcuts mean?+
They're standard aliases some cron implementations support in place of the five fields: @hourly is "0 * * * *", @daily (also @midnight) is "0 0 * * *", @weekly is "0 0 * * 0", @monthly is "0 0 1 * *", and @yearly (also @annually) is "0 0 1 1 *". @reboot is different — it runs once at startup rather than on a schedule, so there's no "next run time" to compute for it.
Why does this tool say no matching time was found?+
That means the expression describes a moment that can never actually occur — the classic case is a day-of-month value that doesn't exist in the allowed months, like day 31 with month restricted to February. Double-check that the day and month fields can actually overlap on a real calendar.