What this builds
Standard 5-field crontab expressions: minute, hour, day-of-month, month, day-of-week. Type values directly into each field, watch the plain-English description update at the bottom, copy the result.
The presets cover most schedules in one click, every minute, every 5 minutes, every hour, daily at 3 AM, weekdays at 9 AM, weekly on Sunday, monthly on the 1st. Tune from there if you need something specific.
Cron field semantics
Each field accepts:
*: every value (every minute, every hour, etc.)*/N: every N units (*/15in minute field = every 15 minutes)A-B: a range (1-5in day-of-week = Monday through Friday)A,B,C: a list (0,15,30,45in minute = on the quarter hours)A-B/N: range with step (9-17/2in hour = 9, 11, 13, 15, 17)- A single number, that exact value
Combine ranges and lists in one field. 0 9-17,21 * * 1-5 means: at minute 0, between 9-17 plus 21, every day, every month, weekdays only.
Pair this with the cron parser
This is the builder: you type a schedule, get a cron expression. The companion cron-parser is the reader: paste an existing cron expression, get a plain-English description plus the next several run times.
Use cases:
- Builder: writing a new scheduled job. Click presets, tune fields, copy.
- Parser: inheriting an existing crontab from a colleague. Paste, read, understand.
The two tools share zero state, you can have both open in different tabs.
Common patterns
*/5 * * * * Every 5 minutes
0 * * * * Every hour, on the hour
0 0 * * * Daily at midnight
0 9 * * 1-5 Weekdays at 9 AM
0 0 1 * * First of every month at midnight
0 0 1 1 * Yearly on January 1
0 0 * * 0 Weekly on Sunday at midnight
30 6 * * * Daily at 6:30 AM
0 0 1,15 * * The 1st and 15th of each month at midnight
Many schedulers (Jenkins, GitHub Actions) accept slightly extended cron syntax with a 6th field for seconds. This builder uses the standard 5-field unix crontab format.
Day-of-month and day-of-week interaction
When BOTH day-of-month and day-of-week are specified (i.e. neither is *), most cron implementations interpret this as OR, not AND. So 0 0 13 * 5 runs on the 13th of any month OR on any Friday, not just on Friday the 13th.
This is a famous gotcha. To match Friday the 13th specifically, you’d need a wrapper script that checks the date and runs the actual command only if both conditions are true.
Day-of-week numbering
Standard cron uses 0-6 = Sunday-Saturday. Most implementations also accept 7 as Sunday for compatibility with old Unix variants. Modern cron also accepts three-letter abbreviations (SUN, MON, …) but the builder uses numbers for consistency.
The week starts on Sunday in cron, regardless of locale. If you’re used to Monday-first calendars, expect to mentally adjust.
When NOT to use cron
Cron is great for periodic, schedule-based execution. It’s bad for:
- Event-driven triggers: when something happens, not when the clock hits a number. Use webhooks or message queues.
- Sub-minute precision: cron’s smallest unit is one minute. For finer scheduling, use a job runner.
- Distributed coordination: running cron on multiple servers leads to duplicate executions. Use a centralized scheduler (Kubernetes CronJob, Airflow, Temporal).
- Complex retry logic: cron just runs the command at the scheduled time. If it fails, your script needs to handle retries itself.
Frequently asked questions
What about 6-field cron with seconds? Used by Quartz, Spring Scheduler, and a few others. The first field becomes seconds, the rest shift over. This builder is 5-field only, for 6-field, hand-edit the output.
Why does my schedule run at unexpected times? Time zones. Most servers run cron in UTC. If your job needs to run at 9 AM local time, make sure your crontab matches the server’s timezone.
Can I use this for AWS EventBridge / GCP Cloud Scheduler? Mostly yes, but cloud schedulers have their own quirks. AWS uses a 6-field format with year as the last field. GCP uses standard 5-field. Read the cloud provider’s docs for edge cases.
What’s the difference between 0 and * in a field?
0 means “exactly value zero.” * means “every possible value.” 0 * * * * is “every hour at minute 0” while * * * * * is “every minute.”