The five fields you’re building
This generator produces a standard 5-field POSIX cron expression without you memorizing the syntax. The fields, in order:
| Field | Range | * means |
|---|---|---|
| Minute | 0–59 | every minute |
| Hour | 0–23 | every hour |
| Day of month | 1–31 | every day |
| Month | 1–12 | every month |
| Day of week | 0–7 (0/7 = Sun) | every weekday |
Pick values with the visual controls and the tool emits the expression plus the next run times. To go the other way — decode an existing expression — use the Cron Expression Parser.
Platform quirks to know before you deploy
The expression is portable, but each platform adds constraints:
- GitHub Actions — UTC only,
*/5minimum, best-effort timing (see FAQ). - Kubernetes CronJob — supports a
timeZonefield; watch forconcurrencyPolicyandstartingDeadlineSeconds. - AWS EventBridge — uses a slightly different 6-field syntax with
?for “no specific value.” - Vixie cron (Linux) — the classic; honors
TZin the crontab.
The day-of-month + day-of-week trap
The biggest gotcha in all of cron: if you set both day-of-month and day-of-week to non-* values, they combine with OR, not AND. 0 9 1 * 1 runs on the 1st of the month and every Monday — not only Mondays that are the 1st. Keep one of the two as * for predictable schedules, and push any “both must be true” logic into the script itself.
Sub-minute and “last day”
Cron’s floor is one minute (* * * * *) — for anything faster, use systemd timers or an application scheduler. And there’s no standard “last day of month” token; common workarounds are a shell guard ([ "$(date -d tomorrow +\%d)" -eq 1 ]) or an extended scheduler like Quartz that supports the L modifier. Build the achievable schedule here, then layer those tricks on top if needed.