Cron expression for the first day of every month
At 00:00, on day 1 of the month.
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
Day 1 exists in every month, so a monthly job on the first day always runs exactly once a month. The shortcut @monthly is defined as 0 0 1 * *. Typical uses are monthly invoices, monthly reports, resetting a usage counter, or archiving last month's logs.
Watch out for this
Days 29, 30 and 31 are different: a job set for the 31st simply does not run in months that have fewer days, so 0 0 31 * * skips February, April, June, September and November. For a job on the last day of the month use the page on the last day of the month. For payment-related jobs on the 1st, check the time zone: midnight UTC on the 1st is 05:30 on the 1st in India but 18:30 on the previous day in New York.
What each field says
| Field | Written | Means |
|---|---|---|
| Minute | 0 | 0 |
| Hour | 0 | 0 |
| Day of month | 1 | 1 |
| Month | * | every month |
| Day of week | * | every day of the week |
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 |
|---|---|
| Tue 1 Dec, 00:00 | Tue 1 Dec, 05:30 |
| Fri 1 Jan, 00:00 | Fri 1 Jan, 05:30 |
| Mon 1 Feb, 00:00 | Mon 1 Feb, 05:30 |
| Mon 1 Mar, 00:00 | Mon 1 Mar, 05:30 |
| Thu 1 Apr, 00:00 | Thu 1 Apr, 05:30 |
| Sat 1 May, 00:00 | Sat 1 May, 05: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 0 1 * ?GitHub Actions
Scheduled workflows run in UTC unless you add a time zone. In the workflow file:
on:
schedule:
- cron: '0 0 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 0 1 * *"
timeZone: "Etc/UTC"A crontab line to copy
The command is made up. Replace it with your own and use full paths:
0 0 1 * * /home/me/bin/monthly-invoices.sh >> /home/me/invoices.log 2>&1Questions
What if the 1st falls on a Sunday?
The job still runs. Cron does not know about weekends when the day-of-week field is a star.
Can I run on the first working day?
Not directly. Run on days 1 to 3 and let the script exit unless today is the first weekday, or use Quartz where 1W means the nearest weekday to the 1st.
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.