Quick answer
The cron expression for every quarter is 0 0 1 1,4,7,10 *. The month list 1,4,7,10 picks January, April, July and October, the 1 in the day-of-month field picks the first day, and 0 0 sets the time to 00:00. That is four runs a year, at the start of each calendar quarter. The step form 0 0 1 */3 * gives the same dates.
- Live next runs
- Any time zone
- Field-by-field breakdown
- Seven platform snippets
- Daylight saving aware
How to use this schedule
- 1Copy
0 0 1 1,4,7,10 *with the Copy expression button. - 2Check Next runs in your time zone to confirm it fires when you expect, including around daylight saving changes.
- 3Pick your platform under Use it on your platform and copy the ready-made crontab line, workflow, manifest or timer.
- 4Need a different time or day? Click Customize to open it in the cron expression generator and change any field.
Should I write 1,4,7,10 or */3?
Both produce the same four dates. */3 in the month field steps through 1 to 12 in threes, starting at 1, which gives January, April, July and October. The list is longer but says exactly what it means, and it is easier to change later. Other quarter patterns:
| Quarters start in | Expression |
|---|---|
| January, April, July, October | 0 0 1 1,4,7,10 * |
| The same, written as a step | 0 0 1 */3 * |
| February, May, August, November | 0 0 1 2,5,8,11 * or 0 0 1 2-11/3 * |
| March, June, September, December | 0 0 1 3,6,9,12 * or 0 0 1 3-12/3 * |
Many companies run a fiscal year that doesn't start in January, so confirm which months your finance team means by "quarter" before you ship a quarterly close job.
How do I run a job at the end of each quarter instead?
The last day of a quarter is March 31, June 30, September 30 or December 31. Those days differ, so one expression can't match all four without also matching other dates, but two can: 0 0 31 3,12 * and 0 0 30 6,9 *. In a crontab, add both lines with the same command.
Alternatively, run on the first day of the next quarter with 0 0 1 1,4,7,10 * and have the job process the quarter that just ended, which is usually what a quarterly report needs anyway: the data is complete and the schedule stays a single line. The same idea works for monthly jobs and yearly ones.
What does each field in 0 0 1 1,4,7,10 * mean?
| Field | Value | Allowed | Meaning |
|---|---|---|---|
| Minute | 0 | 0–59 | at minute 0 (on the hour) |
| Hour | 0 | 0–23 | at hour 0 (midnight) |
| Day of month | 1 | 1–31 | on the 1st of the month |
| Month | 1,4,7,10 | 1–12, JAN–DEC | only in January, April, July and October |
| Day of week | * | 0–7 (0 and 7 are Sunday), SUN–SAT | every day of the week |
Read together: At 00:00 on January 1, April 1, July 1 and October 1.
How do I adjust 0 0 1 1,4,7,10 * to my own schedule?
Small edits to 0 0 1 1,4,7,10 * cover most real-world needs:
| Expression | What it does |
|---|---|
0 0 1 */3 * | The same four dates, written with a step |
0 6 1 1,4,7,10 * | 6 AM on the first day of each quarter |
0 0 1 2,5,8,11 * | Quarters that start in February |
0 0 31 3,12 * | End of Q1 and Q4; pair it with 0 0 30 6,9 * for Q2 and Q3 |
0 0 15 1,4,7,10 * | The 15th of the first month of each quarter |
Need something else? Click Customize at the top of the page to open this schedule in the cron expression generator and change any field.
Related schedules: Every month · First Monday of the month · Every year · Last day of the month
Browse all schedules in the cron schedule library.
How do I run 0 0 1 1,4,7,10 * in crontab, GitHub Actions, Kubernetes and the cloud?
| Platform | Write it as | Time zone |
|---|---|---|
| Linux crontab | 0 0 1 1,4,7,10 * | Server's time zone; CRON_TZ= in cronie |
| GitHub Actions | - cron: "0 0 1 1,4,7,10 *" | UTC by default; add timezone: (IANA name) |
| Kubernetes CronJob | schedule: "0 0 1 1,4,7,10 *" | Set timeZone: (1.27+) |
| Cloudflare Workers | 0 0 1 1,4,7,10 * | UTC only; numbers weekdays from 1 = Sunday, so use names |
| Vercel Cron Jobs | 0 0 1 1,4,7,10 * | UTC only; Hobby runs it within the hour (±59 min) |
| AWS EventBridge Scheduler | cron(0 0 1 1,4,7,10 ? *) | Takes a time zone; legacy scheduled rules are UTC only |
| systemd timer | OnCalendar=*-1/3-01 00:00:00 | Add a zone after the time, e.g. Europe/London |
In a crontab (crontab -e), the full line looks like this:
0 0 1 1,4,7,10 * /path/to/job.sh >> /var/log/job.log 2>&1The live panel at the top of the page builds complete, copy-ready files for each platform (workflow, CronJob manifest, wrangler.toml, vercel.json, AWS CLI and systemd units) and can shift the schedule to UTC for platforms that need it.
What can go wrong with 0 0 1 1,4,7,10 *?
*/3in the month field starts at January because months start at 1. For quarters that start in another month, use a list or a range with a step such as2-11/3.- A quarterly job runs only four times a year, so a broken script can go unnoticed for three months. Test it on a temporary schedule and alert on failure.
- If the server is down at 00:00 on the 1st, plain cron won't retry until next quarter. Use anacron, a systemd timer with
Persistent=true, or a monitor that expects the run. - Quarter boundaries are dates in a particular time zone. A job at 00:00 UTC on April 1 runs on the evening of March 31 in the Americas.
- On UTC-only platforms (Cloudflare Workers, Vercel, legacy EventBridge rules), the local time this runs at moves by an hour when daylight saving time starts or ends. Use GitHub's
timezone:, KubernetestimeZone, EventBridge Scheduler or cronie'sCRON_TZto pin it to local time.
Frequently asked questions
Last updated by the Playxoft engineering team.