Cron expression for every Monday at 8 AM
At 08:00, on Monday.
Five fields for Linux, GitHub Actions and Kubernetes (minute hour day month weekday). Six or seven for Quartz. Nothing you type leaves your device.
What it means and when to use it
A Monday-morning schedule gives people a fresh task or report as the week starts: a list of open orders, a weekly planning email, a reminder to submit time sheets. Monday is day 1 in standard cron. In Quartz, where days run 1 to 7 from Sunday, Monday is 2, so the line is 0 0 8 ? * 2; 0 0 8 ? * MON is easier to read and means the same in Quartz and Spring.
Watch out for this
If the weekly job should skip a week now and then, such as "every second Monday", cron has no way to say it, because the fields do not remember the previous run. The usual answer is to run weekly and let the script keep the date of the last run, or compute the week number: [ $(( $(date +\%-V) \% 2 )) -eq 0 ] && /home/me/bin/job.sh runs only in even ISO weeks (GNU date; the - removes the leading zero, which would otherwise make week 08 or 09 an invalid octal number; the percent signs need the backslashes inside a crontab).
What each field says
| Field | Written | Means |
|---|---|---|
| Minute | 0 | 0 |
| Hour | 8 | 8 |
| Day of month | * | every day of the month |
| Month | * | every month |
| Day of week | 1 | Mon |
An example of the next runs
If it were Friday 13 November 2026 at 10:20 UTC, the next six runs would be these. Times are shown in UTC and in India time (UTC+5:30).
| UTC | India time |
|---|---|
| Mon 16 Nov, 08:00 | Mon 16 Nov, 13:30 |
| Mon 23 Nov, 08:00 | Mon 23 Nov, 13:30 |
| Mon 30 Nov, 08:00 | Mon 30 Nov, 13:30 |
| Mon 7 Dec, 08:00 | Mon 7 Dec, 13:30 |
| Mon 14 Dec, 08:00 | Mon 14 Dec, 13:30 |
| Mon 21 Dec, 08:00 | Mon 21 Dec, 13:30 |
The same schedule in other places
Quartz
Quartz has a seconds field in front, uses ? in one day field, and counts Sunday as 1:
0 0 8 ? * 2GitHub Actions
Scheduled workflows run in UTC unless you add a time zone. In the workflow file:
on:
schedule:
- cron: '0 8 * * 1'Kubernetes CronJob
In a CronJob manifest the schedule goes in spec.schedule. Without spec.timeZone, it is read in the time zone of the cluster's controller:
spec:
schedule: "0 8 * * 1"
timeZone: "Etc/UTC"A crontab line to copy
The command is made up. Replace it with your own and use full paths:
0 8 * * 1 /home/me/bin/monday-report.sh >> /home/me/monday.log 2>&1Questions
How do I run every second Monday?
Run every Monday and test the ISO week number in the command, as in the line above, because cron fields cannot count weeks.
This is an independent guide and tool. It is not connected with crontab.guru, Quartz, GitHub, Kubernetes, Spring or the Linux projects named here. Product names belong to their owners.