0 0 1 */3 * runs a job at 00:00 on the first day of each calendar quarter: January 1, April 1, July 1 and October 1. The day of month is 1, and */3 in the month field steps through the year three months at a time. 0 0 1 1,4,7,10 * is the same schedule written out.
When it fires
Checked on October 14, 2026, the next five runs are:
Jan 1 2027 Apr 1 2027 Jul 1 2027 Oct 1 2027 Jan 1 2028 (all at 00:00)
The step starts in January
Months are numbered 1 to 12, so */3 counts from 1 and picks 1, 4, 7 and 10. To run in the last month of each quarter instead, start the step at 3: 0 0 1 3-12/3 * runs on March 1, June 1, September 1 and December 1. For the quarter’s last day, where L is supported, 0 0 L 3,6,9,12 * runs on March 31, June 30, September 30 and December 31.
A fiscal year that starts in another month moves the start of the step. With quarters that begin in February, May, August and November, use 0 0 1 2-11/3 *; checked from October 14, its next run is November 1.
Three months between runs
A job that runs four times a year can break in between without anyone noticing, and then the next try is a quarter away. Have it report failures loudly, and run it by hand after changing anything it depends on. On a machine that may be off at midnight on the 1st, plain cron skips that quarter; a systemd timer with Persistent=true runs the missed job at the next boot.
The same schedule elsewhere
- crontab:
0 0 1 */3 * /usr/local/bin/quarterly.sh. There’s no@quarterly: Vixie cron and cronie reject it. - GitHub Actions:
cron: '0 0 1 */3 *', in UTC. In a public repository, GitHub disables scheduled workflows after 60 days without repository activity, which is shorter than a quarter. - Kubernetes CronJob:
schedule: "0 0 1 */3 *". - AWS EventBridge:
cron(0 0 1 1/3 ? *), orcron(0 0 1 JAN,APR,JUL,OCT ? *). - systemd timer:
OnCalendar=quarterly, which means*-01,04,07,10-01 00:00:00. - Spring
@Scheduled:0 0 0 1 */3 *, or0 0 0 1 1,4,7,10 *.