0 0 1 * * runs a job at midnight on the 1st of every month. The third field is the day of month, so 1 picks the first. @monthly is the same schedule in most crons.
When it fires
Checked on October 14, 2026, the next five runs are:
Nov 1 Dec 1 Jan 1 Feb 1 Mar 1 (all at 00:00)
To run later in the day, change the first two fields: 30 6 1 * * runs at 06:30 on the 1st.
The last day of the month
Standard cron has no field for it, because months have 28 to 31 days. The usual workaround runs on every possible last day and checks whether tomorrow is the 1st:
0 23 28-31 * * [ "$(date -d tomorrow +\%d)" = 01 ] && /usr/local/bin/close-month.sh
Quartz and AWS write it as L in the day-of-month field.
The same schedule elsewhere
- GitHub Actions:
cron: '0 0 1 * *', at midnight UTC. - Kubernetes CronJob:
schedule: "0 0 1 * *", or"@monthly". - AWS EventBridge:
cron(0 0 1 * ? *); the last day iscron(0 0 L * ? *). - systemd timer:
OnCalendar=monthly, or*-*-01 00:00:00. - Spring
@Scheduled:0 0 0 1 * *; the last day is0 0 0 L * *.