Everything you need to write and read cron schedules. Open the matching cron parser to see the next few run times for any expression you build here.
Updated October 2026 · covers Vixie cron / crontab(5), Quartz, Kubernetes CronJob, GitHub Actions, Vercel Cron, systemd timers.
5-field cron (classic Unix, Kubernetes, GitHub Actions, Vercel):
┌───────────── minute (0-59) │ ┌─────────── hour (0-23) │ │ ┌───────── day of month (1-31) │ │ │ ┌─────── month (1-12 or JAN-DEC) │ │ │ │ ┌───── day of week (0-6 or SUN-SAT, 0=Sunday) │ │ │ │ │ * * * * *
6-field cron (Quartz, Spring, some AWS):
┌───────────── second (0-59) ← extra field │ ┌─────────── minute (0-59) │ │ ┌───────── hour (0-23) │ │ │ ┌─────── day of month (1-31) │ │ │ │ ┌───── month (1-12) │ │ │ │ │ ┌─── day of week (1-7 in Quartz, 1=Sunday) ← note offset │ │ │ │ │ │ * * * * * *
7-field cron (Quartz, with optional year):
second minute hour day-of-month month day-of-week year(optional 1970-2099)
SUN, MON, etc.| Character | Meaning | Example |
|---|---|---|
| * | Any value in that field | * * * * * → every minute |
| , | List of values | 0,15,30,45 * * * * → every 15 min |
| - | Range | 0 9-17 * * * → every hour 9am-5pm |
| / | Step value — "every N" | */15 * * * * → every 15 min |
| ? | No specific value (Quartz only; one of day-of-month / day-of-week must be ?) | 0 0 12 ? * MON |
| L | Last — "last day of month" or "last Friday" (Quartz, AWS) | 0 0 L * ? → last day of each month |
| W | Nearest weekday to the given day-of-month (Quartz, AWS) | 0 0 15W * ? → nearest weekday to the 15th |
| # | Nth weekday of the month (Quartz) | 0 0 ? * MON#2 → 2nd Monday |
| Shortcut | Equivalent to | Means |
|---|---|---|
| @yearly | 0 0 1 1 * | Once a year, Jan 1 at 00:00 |
| @annually | 0 0 1 1 * | Alias for @yearly |
| @monthly | 0 0 1 * * | First of each month at 00:00 |
| @weekly | 0 0 * * 0 | Every Sunday at 00:00 |
| @daily | 0 0 * * * | Every day at 00:00 |
| @midnight | 0 0 * * * | Alias for @daily |
| @hourly | 0 * * * * | Top of every hour |
| @reboot | — | Run once at crond startup. Not supported by Quartz / k8s / most managed cron. |
| @every 15m | — | Go's robfig/cron syntax; not standard |
5-field classic cron unless marked otherwise. Paste any of these into our cron parser to see the next few run times.
* * * * **/5 * * * **/15 * * * **/30 * * * *10 * * * *0 * * * *0 */2 * * *0 */6 * * *0 9-17 * * 1-50 0 * * *30 6 * * *0 6,18 * * *0 8 * * 1-50 10 * * 6,00 10 * * SAT,SUN.0 9 * * 10 17 * * 530 23 * * 00 12 * * MON,WED,FRI0 0 1 * *0 9 15 * *0 0 0 L * ?0 0 17 ? * 6L0 0 9 15W * ?0 0 10 ? * TUE#20 0 1 1,4,7,10 *0 0 1 1 *@yearly.0 9 1 7 **/15 9-17 * * 1-5*/5 * * * **/30 9-11,13-16 * * 1-530 11 * * 1-5 plus 0,30 12 * * 1-5 if you need every :00 and :30 too.30 2 * * *0 3 * * 045 * * * *5 0 * * *17 * * * *0 1-23/4 * * *| Platform | Fields | DoW | Smallest unit | Max frequency | Notes |
|---|---|---|---|---|---|
| Vixie cron / crontab(5) | 5 | 0-7, 0 & 7 = Sun | minute | every minute | Supports @reboot. Shell env matters. |
| Quartz / Spring | 6-7 | 1-7, 1 = Sun | second | every second | Supports L W # ?. Must use ? for one of DoM / DoW. |
| Kubernetes CronJob | 5 | 0-6, 0 = Sun | minute | every minute | Timezone field (.spec.timeZone) GA since 1.27. |
| GitHub Actions | 5 | 0-6, 0 = Sun | 5 minutes | every 5 min | Runs UTC. Up to ~15 min late during peak. |
| Vercel Cron | 5 | 0-6, 0 = Sun | minute (Pro+) | varies by plan | Runs UTC. Hobby plan is daily minimum. |
| AWS EventBridge / CloudWatch | 6 | 1-7, 1 = Sun | minute | every minute | Must use ? for one of DoM / DoW. UTC only. |
| systemd timer | — (its own format) | Mon,Tue… | second | < second | Not cron syntax at all. Uses OnCalendar=. |
| Go robfig/cron | 5 or 6 | 0-6 | second (optional) | every second | Supports @every 30s syntax. |
Classic cron runs in the system's time zone. Managed cron almost always runs in UTC. For "every day at 9am local time" to actually happen at 9am local, you need to either:
CRON_TZ=America/Los_Angeles in the crontab, or .spec.timeZone in a k8s CronJob).If you set both day-of-month and day-of-week to non-*, classic cron runs when either matches (OR). So 0 0 1 * MON fires on the 1st of every month and every Monday. Quartz uses AND, which is why it forces ? on one of them.
Cron runs with a minimal environment — no $PATH customizations, no .bashrc, often no $HOME. Reference binaries by absolute path, or source your profile at the top of the script.
Vixie cron silently ignores the last line if it doesn't end with a newline. Always leave a trailing newline.
If a job runs long enough that the next scheduled run starts before it finishes, you'll have two copies running. Wrap long jobs in flock or similar.
Any output a cron job produces is mailed to the user — unless you redirect to a log or /dev/null. Add >> /var/log/myjob.log 2>&1.