Cron expression for every quarter
At 00:00, on day 1 of the month, in January, April, July and October.
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
The month field takes steps just like the others: */3 over 1 to 12 gives months 1, 4, 7 and 10, which are January, April, July and October. Combined with day 1 and midnight, that is the first day of each calendar quarter. Typical uses are quarterly GST-style review reminders, quarterly archive jobs, or a "review your settings" mail.
Watch out for this
A step in the month field starts at the first value of the range, which is month 1, so you cannot get February, May, August and November with */3. For those, give a range with a start, 2-12/3, or list the months, 2,5,8,11. India's financial year starts in April, so quarter starts for an Indian business are April, July, October and January: that is the same */3 pattern read differently, which is why this one line fits both calendar and Indian fiscal quarters.
What each field says
| Field | Written | Means |
|---|---|---|
| Minute | 0 | 0 |
| Hour | 0 | 0 |
| Day of month | 1 | 1 |
| Month | */3 | Jan, Apr, Jul, Oct |
| 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 |
|---|---|
| Fri 1 Jan, 00:00 | Fri 1 Jan, 05:30 |
| Thu 1 Apr, 00:00 | Thu 1 Apr, 05:30 |
| Thu 1 Jul, 00:00 | Thu 1 Jul, 05:30 |
| Fri 1 Oct, 00:00 | Fri 1 Oct, 05:30 |
| Sat 1 Jan, 00:00 | Sat 1 Jan, 05:30 |
| Sat 1 Apr, 00:00 | Sat 1 Apr, 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 */3 ?GitHub Actions
Scheduled workflows run in UTC unless you add a time zone. In the workflow file:
on:
schedule:
- cron: '0 0 1 */3 *'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 */3 *"
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 */3 * /home/me/bin/quarter-start.sh >> /home/me/quarter.log 2>&1Questions
Can I name the months?
Yes: 0 0 1 JAN,APR,JUL,OCT * is the same. Names are accepted in the month field in every system on this site.
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.