Yearly (January 1st at Midnight)
0 0 1 1 * 0 0 0 1 1 ? 0 0 1 1 * 0 0 1 1 ? * 0 0 0 1 1 * 0 0 1 1 * Runs at 00:00 on January 1st every year — 1 invocation per year.
Use in your stack
# Once a year at midnight January 1st
0 0 1 1 * /usr/local/bin/annual-archive.sh
# Equivalent shortcuts (Linux crontab)
@yearly /usr/local/bin/annual-archive.sh
@annually /usr/local/bin/annual-archive.sh
{ "cron": "0 0 0 1 1 ?", "timezone": "UTC" }
apiVersion: batch/v1
kind: CronJob
metadata:
name: annual-archive
spec:
schedule: "0 0 1 1 *"
timeZone: "UTC"
jobTemplate:
spec:
template:
spec:
containers:
- name: archive
image: my-image:latest
restartPolicy: OnFailure
cron(0 0 1 1 ? *)
@Scheduled(cron = "0 0 0 1 1 *")
public void newYear() { /* ... */ }
on:
schedule:
- cron: '0 0 1 1 *'
Next runs
Pick a timezone to see when this expression fires next.
Next 10 runs
- 012027-01-01T00:00:00.000Z
- 022028-01-01T00:00:00.000Z
- 032029-01-01T00:00:00.000Z
- 042030-01-01T00:00:00.000Z
- 052031-01-01T00:00:00.000Z
- 062032-01-01T00:00:00.000Z
- 072033-01-01T00:00:00.000Z
- 082034-01-01T00:00:00.000Z
- 092035-01-01T00:00:00.000Z
- 102036-01-01T00:00:00.000Z
Variations
Common use cases
- Annual data archive rotation.
- Calendar-year report generation.
- Rotating long-lived API tokens or credentials on a yearly cadence.
- Resetting year-scoped counters (annual quotas, lifetime-to-date stats, etc.).
Gotchas
- Linux crontab supports `@yearly` and `@annually` as shortcuts for `0 0 1 1 *`. Kubernetes CronJob accepts both. GitHub Actions does not.
- Quartz: `0 0 0 1 1 ?` — six fields with seconds. With the optional year field, you can also pin to a specific year: `0 0 0 1 1 ? 2030`.
- AWS EventBridge: `0 0 1 1 ? *` — the trailing `*` is the year field (any year).
- If your timezone has a DST transition near January 1st (some Southern Hemisphere zones do), pin the timezone explicitly so the job doesn't drift.
0 0 1 1 * is the once-a-year schedule. The infrastructure cost is zero — one invocation per year doesn’t move any needles. The interesting part is making sure the job actually works when it eventually runs, because you won’t have many chances to fix it.
Frequently asked questions
What does `0 0 1 1 *` mean?
Minute `0`, hour `0` (midnight), day-of-month `1`, month `1` (January), day-of-week `*` (any). So the job fires at midnight on January 1st every year — one invocation per year.
Is `0 0 1 1 *` the same as `@yearly`?
Yes, on systems that support the shortcut. Linux crontab accepts `@yearly` and the synonym `@annually` as shorthand for `0 0 1 1 *`. Kubernetes CronJob accepts them as well. GitHub Actions does not — write the full expression.
How do I run on a different annual date, like July 4th?
Change the day-of-month and month fields. `0 0 4 7 *` runs at midnight on July 4th every year. `0 0 25 12 *` runs at midnight on December 25th. The day-of-month and month fields together specify the annual date.
How do I run on the same date in a specific year only?
Standard Unix cron has no year field — you can't restrict to a specific year directly. Quartz and AWS EventBridge support a year field (the 7th in Quartz, the 6th in EventBridge): `0 0 0 1 1 ? 2030` in Quartz fires only on January 1st, 2030. For Unix or Kubernetes, gate inside the script with a year check.
Browse all cron patterns
Every schedule Cronuru documents, with its expression and code snippets for six dialects.