Cron expression for every Monday
0 9 * * 1At 09:00, on Monday.
Day of week 1 is Monday. This runs every Monday at 09:00.
Try it and tweak it
Change any field below and the preview updates. Set the time zone to match your server.
✓ Valid cron
At 09:00, on Monday.
Next 10 runs
Calculating in your browser…
Times are computed in your browser for the selected zone and are informational. The server that runs the job uses its own zone (often UTC) and cron flavour, so verify there.
Same schedule in other dialects
Unix crontab
0 9 * * MONQuartz
0 0 9 ? * MONSpring @Scheduled
0 0 9 ? * MONAWS EventBridge
cron(0 9 ? * MON *)Variations
0 0 * * MON | Every Monday at midnight |
0 9 ? * MON#1 | First Monday of the month (Quartz/AWS only; in Unix cron 1-7 plus 1 means either, not both) |
“First Monday of the month” can’t be written in standard cron: 0 9 1-7 * 1 runs on days 1–7 and on every Monday, because of the day-field OR rule. Schedule 0 9 1-7 * * and add [ "$(date +\%u)" = 1 ] && before the command.
In other schedulers
| crontab line | 0 9 * * 1 /path/to/command |
| Quartz | 0 0 9 ? * MON |
| Spring | @Scheduled(cron = "0 0 9 ? * MON") |
| AWS EventBridge | cron(0 9 ? * MON *) |
| GitHub Actions | - cron: '0 9 * * 1' (UTC) |
| Kubernetes | schedule: "0 9 * * 1" |
Questions
What is the cron expression for every monday?
0 9 * * 1. At 09:00, on Monday.
How do I write it in Quartz or Spring?
Add a seconds field and use "?" for the unused day field: 0 0 9 ? * MON. In Spring: @Scheduled(cron = "0 0 9 ? * MON").
What is the AWS EventBridge version?
cron(0 9 ? * MON *). AWS uses six fields with a year at the end and needs "?" in one of the day fields.
Which time zone will it use?
The time zone of the machine or service running cron. GitHub Actions and Vercel use UTC; Kubernetes uses spec.timeZone if set. The preview above lets you pick a zone.