ShareYourGroupShareYourGroupCron Helper

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

FieldWrittenMeans
Minute00
Hour88
Day of month*every day of the month
Month*every month
Day of week1Mon

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).

UTCIndia time
Mon 16 Nov, 08:00Mon 16 Nov, 13:30
Mon 23 Nov, 08:00Mon 23 Nov, 13:30
Mon 30 Nov, 08:00Mon 30 Nov, 13:30
Mon 7 Dec, 08:00Mon 7 Dec, 13:30
Mon 14 Dec, 08:00Mon 14 Dec, 13:30
Mon 21 Dec, 08:00Mon 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 ? * 2

GitHub 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>&1

Questions

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.