⚡ 10-second version
Nobody reads */15 3 * * 1-5 correctly on the first try. Paste it into tooladda.online/cron-expression-generator.html and get a sentence plus the next ten actual run times — or build the schedule from dropdowns and get the expression.
❗ Important
A cron typo doesn't error. It runs — just at the wrong time, silently, possibly a thousand times more often than you intended. Previewing the next run times is the only reliable way to know you got it right.
🚨 The day-of-month / day-of-week trap
This is the one genuine landmine in cron, it bites experienced people, and it's in the manual where nobody looks.
The five fields are:
┌───────────── minute 0-59
│ ┌─────────── hour 0-23
│ │ ┌───────── day of month 1-31
│ │ │ ┌─────── month 1-12
│ │ │ │ ┌───── day of week 0-6 (Sunday = 0)
│ │ │ │ │
* * * * *
Normally all fields must match — an AND. But if both day-of-month and day-of-week are restricted (neither is *), cron switches to OR.
| Expression | What people expect | What actually happens |
|---|---|---|
0 0 1 * 1 |
Midnight on the 1st, but only if it's a Monday | 🚨 Midnight on the 1st of every month, AND every Monday — roughly 16 runs a month |
0 0 13 * 5 |
Friday the 13th only | Every 13th and every Friday |
0 0 1 * * |
1st of the month | ✅ Correct — day-of-week is *, so AND applies |
0 0 * * 1 |
Every Monday | ✅ Correct |
If you actually want "the 1st only when it's a Monday", cron can't express it. Schedule it for every Monday and check the date inside your script.
Other things that catch people
| Expression | Means | Common misreading |
|---|---|---|
*/15 * * * * |
:00, :15, :30, :45 | "every 15 minutes from when I saved it" — no, it's aligned to the clock |
*/20 * * * * |
:00, :20, :40 | Fine |
*/40 * * * * |
:00, :40 — then a 20-minute gap | "every 40 minutes" — the step resets each hour, it does not wrap |
0 */5 * * * |
Every 5 hours at :00 | Confused with every 5 minutes |
0 0 * * 7 |
Sunday (7 is accepted alongside 0) | Thinking 7 means Monday |
⚠️ Warning
Cron uses the system's time zone unless the scheduler explicitly supports one. A job set for 02:30 daily will be skipped or run twice on DST transition days. For anything that must not double-run, schedule outside 01:00–03:00 local, or run in UTC.
🧭 How it works
✨ What's inside
| ### 📖 Both directions Expression → English, and dropdowns → expression. Most tools do one; you need the other one exactly when you're debugging someone else's crontab. | ### 🗓️ Next run preview Ten concrete dates and times. This is the feature that catches the DOM/DOW trap before production does. |
| ### 🌍 Time zone aware See the schedule in the zone your server actually runs in, not just your laptop's. | ### 🎯 Common presets Hourly, nightly, weekdays-only, first-of-month, every 15 minutes — starting points you then adjust. |
🛠️ Real jobs
| Situation | What you check |
|---|---|
| 💾 Nightly backup | That it runs once a night, not once a minute. |
| 🧹 Cleanup job | That "every 40 minutes" isn't leaving a 20-minute gap each hour. |
| 📧 Weekly report email | The right weekday, in the right zone. |
| ☸️ Kubernetes CronJob | Same syntax, and the same DOM/DOW trap. |
| 🔍 Auditing an inherited crontab | Read what each line actually does before you touch it. |
| 🚀 CI scheduled pipeline | GitHub Actions schedule uses cron — and runs in UTC. |
📖 Four steps
1. Open → tooladda.online/cron-expression-generator.html
2. Enter → paste an expression, or build one with dropdowns
3. Read → the English description
4. VERIFY → the next 10 run times — this is the step that matters
▶ Open it — tooladda.online/cron-expression-generator.html
💡 Tip
Don't schedule everything at
0 0 * * *. Every job on the box firing at exactly midnight creates a CPU and I/O spike, and staggering them (7 0,23 0,41 0) costs nothing and prevents a class of mysterious nightly slowdowns.
❓ FAQ
Is it free?
Free, no signup, and it runs entirely in your browser.
What does */15 * * * * mean?
Every 15 minutes on the clock — :00, :15, :30, :45. Not "15 minutes after I installed it".
Why does my "1st of the month AND Monday" job run so often?
Because with both day fields restricted, cron uses OR, not AND. It runs on every 1st and every Monday. Cron cannot express the AND version — check the date inside your script instead.
Is Sunday 0 or 7?
Both are accepted by most implementations. 1 is always Monday.
Does cron support seconds?
Standard Unix cron does not — one minute is the finest granularity. Some schedulers (Quartz, Spring) add a leading seconds field, making six.
What time zone does it use?
The system's, unless your scheduler lets you set one. GitHub Actions schedules always run in UTC.
Can I schedule "last day of the month"?
Not in standard cron. Some implementations support L; otherwise run daily and exit early unless it's the last day.
🔬 Under the hood
- Cron parser and next-run calculator in vanilla JavaScript, running client-side.
- Implements standard 5-field Vixie cron semantics — including the DOM/DOW OR rule, which is why it can warn you about it.
- Time zone handling via the
IntlAPI. - Covered by unit tests; works offline once loaded.
Originally published on ToolAdda, where Cron Expression Generator runs free in your browser — nothing is uploaded, nothing leaves your device.
Top comments (0)