Regex and cron

Cron Expression for Every Year

Once a year, at 00:00 on January 1. Copy it, check the next runs in your time zone and grab a snippet for your platform.

  • Free foreverNo trial, no paywall, no usage limits.
  • No sign-upOpen the page and start. We never ask for an email to use a tool.
  • PrivateEverything runs in your browser. Your input is never uploaded or stored on our servers.
  • Works offlineOnce the page has loaded, the tool keeps working without a connection.

Cron expression

0 0 1 1 *
Customize
0minuteMinute: at minute 0 (on the hour)0hourHour: at hour 0 (midnight)1day (month)Day of month: on the 1st of the month1monthMonth: only in January*day (week)Day of week: every day of the week

Once a year, at 00:00 on January 1.

Time zone
Run times, the week view and the snippets use this zone. It starts as your device's zone.
Show times as 9:00 AM instead of 09:00.

Next runs

Each run in your selected time zone, with the same moment in UTC. Daylight saving changes follow cronie, the cron on most Linux servers.
Copy run times (ISO 8601)

Next 7 days

Each square is one hour of local time in your selected zone. Darker squares have more runs. Daylight saving changes are not drawn.

Use it on your platform

Copy-ready config for each scheduler. Dialects differ: some only run in UTC, some can't do seconds, Cloudflare and AWS number weekdays from 1 = Sunday. The snippet handles the conversion and says what changed.
A line for crontab -e on Linux or macOS (Vixie cron, cronie).on.schedule for a workflow, with the timezone field GitHub added in March 2026 (UTC when omitted).A CronJob manifest with the timeZone field (Kubernetes 1.27+).Cron Triggers in wrangler.toml for a Worker. Runs in UTC and numbers weekdays from 1 = Sunday.crons in vercel.json plus the route it calls. Runs in UTC.EventBridge Scheduler (any time zone, recommended by AWS) and a legacy EventBridge scheduled rule (UTC).A .timer unit with OnCalendar=, the systemd replacement for cron.
Runs as writtenRuns in your time zone
crontab -e
Copy crontab -eDownload my-job.crontab
# ┌───────────── minute (0–59)
# │ ┌─────────── hour (0–23)
# │ │ ┌───────── day of month (1–31)
# │ │ │ ┌─────── month (1–12)
# │ │ │ │ ┌───── day of week (0–6, Sunday = 0)
# │ │ │ │ │
# * * * * *  command
CRON_TZ=UTC
0 0 1 1 *  /path/to/my-job.sh >> /var/log/my-job.log 2>&1
  • CRON_TZ=UTC is honored by cronie (Fedora, RHEL, Arch). Other cron daemons ignore it and use the server's time zone, so check timedatectl first.
  • Edit with crontab -e. Cron starts the next run even if the last one is still going; wrap the command in flock -n /tmp/my-job.lock to prevent overlaps.

Need scheduled jobs, queues and monitoring that never miss a run? Talk to our team

Quick answer

The cron expression for every year is 0 0 1 1 *, which is what @yearly and @annually expand to. The fields set minute 0, hour 0, day 1 and month 1, so the job runs once a year at 00:00 on January 1. To run yearly on another date, change the day and month fields, such as 0 9 15 3 * for 9 AM on March 15.

  • Live next runs
  • Any time zone
  • Field-by-field breakdown
  • Seven platform snippets
  • Daylight saving aware

How to use this schedule

  1. 1Copy 0 0 1 1 * with the Copy expression button.
  2. 2Check Next runs in your time zone to confirm it fires when you expect, including around daylight saving changes.
  3. 3Pick your platform under Use it on your platform and copy the ready-made crontab line, workflow, manifest or timer.
  4. 4Need a different time or day? Click Customize to open it in the cron expression generator and change any field.

Whose New Year does 0 0 1 1 * run at?

The scheduler's. On a UTC server, the yearly run fires at midnight UTC on January 1, which is already the morning of January 1 in Tokyo (09:00) and still New Year's Eve in New York (19:00 on December 31).

For jobs that roll over a year, such as resetting annual quotas, archiving last year's records or generating year-end summaries, decide which time zone defines "the year" for your business and schedule in it: the timezone: field in GitHub Actions, the timeZone field on a Kubernetes CronJob, a time zone on EventBridge Scheduler, or the converted UTC time. January is winter in the northern hemisphere, so midnight in New York on January 1 is 0 5 1 1 * in UTC.

How do I test a cron job that runs once a year?

Carefully, because the feedback loop is a year long. A few habits help:

  • Keep the logic in a script you can run by hand, and test that directly before trusting the schedule.
  • Temporarily point the schedule at a minute in the near future to prove cron can start the job with its minimal environment, then restore 0 0 1 1 *.
  • Log a clear line on every run and alert on failure; a silent failure won't be noticed until next January.
  • Check the next run date in the preview after every edit. A typo like 0 0 1 13 * is rejected, but 0 0 1 * * is valid and quietly runs every month.

What does each field in 0 0 1 1 * mean?

FieldValueAllowedMeaning
Minute00–59at minute 0 (on the hour)
Hour00–23at hour 0 (midnight)
Day of month11–31on the 1st of the month
Month11–12, JAN–DEConly in January
Day of week*0–7 (0 and 7 are Sunday), SUN–SATevery day of the week

Read together: Once a year, at 00:00 on January 1.

How do I adjust 0 0 1 1 * to my own schedule?

Small edits to 0 0 1 1 * cover most real-world needs:

ExpressionWhat it does
0 9 15 3 *Once a year, on March 15 at 9 AM
0 5 1 1 *Midnight on January 1 in New York, written in UTC
0 0 1 7 *The start of a fiscal year that begins on July 1
0 0 31 12 *00:00 on December 31, the start of New Year's Eve
59 23 31 12 *The last minute of the year

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 quarter · Every month · Last day of the month · Every day at midnight

Browse all schedules in the cron schedule library.

How do I run 0 0 1 1 * in crontab, GitHub Actions, Kubernetes and the cloud?

PlatformWrite it asTime zone
Linux crontab0 0 1 1 *Server's time zone; CRON_TZ= in cronie
GitHub Actions- cron: "0 0 1 1 *"UTC by default; add timezone: (IANA name)
Kubernetes CronJobschedule: "0 0 1 1 *"Set timeZone: (1.27+)
Cloudflare Workers0 0 1 1 *UTC only; numbers weekdays from 1 = Sunday, so use names
Vercel Cron Jobs0 0 1 1 *UTC only; Hobby runs it within the hour (±59 min)
AWS EventBridge Schedulercron(0 0 1 1 ? *)Takes a time zone; legacy scheduled rules are UTC only
systemd timerOnCalendar=*-01-01 00:00:00Add a zone after the time, e.g. Europe/London

In a crontab (crontab -e), the full line looks like this:

0 0 1 1 *  /path/to/job.sh >> /var/log/job.log 2>&1

The 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 *?

  • Dropping the month (0 0 1 * *) turns a yearly job into a monthly one, and cron won't warn you. Check that the fourth field is 1.
  • Plain cron runs nothing if the server is down at the scheduled minute, and the next attempt is a year away. Use anacron, a systemd timer with Persistent=true, or a monitor that expects the run.
  • At 00:00 on January 1, yearly, monthly and daily jobs all start at the same moment. Move the job a few minutes past midnight if they share resources.
  • Yearly jobs depend on credentials, APIs and scripts that change during the year. Run the script by hand a week ahead to catch expired tokens before the scheduled run.
  • 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:, Kubernetes timeZone, EventBridge Scheduler or cronie's CRON_TZ to pin it to local time.

Frequently asked questions

Yes. @yearly and @annually both expand to 0 0 1 1 *, a single run at 00:00 on January 1.
Set the day-of-month and month fields: 0 9 15 3 * runs at 9 AM on March 15 every year. Leave the day-of-week field as an asterisk.
Standard cron has no year field, so the job repeats every year. Remove the entry after it runs, have the job check the year, or use a one-off scheduler such as the at command. AWS EventBridge and Quartz do have a year field.
Usually because of the time zone. A UTC server reaches January 1 at a different moment from your local clock, so the job may run on the evening of New Year's Eve or the morning of January 1 where you are.

Last updated by the Playxoft engineering team.

From the engineers who built this tool

Need scheduled jobs that never miss a run?

Cron is the easy part. Retries, overlapping runs, time zones, queues and alerts when a job silently stops are where schedules break. We build background job systems you can trust, and we will review your setup for free.

More free tools

See all tools

Regex Tester

Test regex live with highlighted matches, plain-English explanations and code export.

Open tool

Cron Expression Generator

New

Build and explain cron schedules, see the next runs in any time zone, copy platform snippets.

Open tool

SQL Formatter

Beautify or minify SQL in 12 dialects, with keyword case, indent and line:column errors.

Open tool

cURL to Python Converter

New

Convert cURL commands into Python requests or httpx code with params, json, files and auth.

Open tool

cURL to Fetch Converter

New

Turn any cURL command into JavaScript fetch() code with headers, JSON, forms and auth.

Open tool

cURL to Axios Converter

New

Convert cURL commands into an Axios request config with params, data, auth and timeouts.

Open tool