Cron every year

At 00:00 on day 1 of the month in JAN.

0 0 1 JAN *

minute · hour · day of month · month · day of week

What this expression selects

At 00:00 on day 1 of the month in JAN. This is a five-field calendar schedule, interpreted in the timezone you configure. It is not an instruction to wait a fixed duration after the last completion.

Common mistakes

This selects calendar day 1, not an elapsed interval. A shorter month or a timezone change can alter the interval between runs.

Next five runs in UTC

Computed at build time from . These are examples, not a live clock.

2027-01-01T00:00:00.000Z
2028-01-01T00:00:00.000Z
2029-01-01T00:00:00.000Z
2030-01-01T00:00:00.000Z
2031-01-01T00:00:00.000Z

A nearby variation

0 8,20 * * *

At hours 8, 20 and minutes 0 every day. Compare it with the expression above before copying; the selected fields change the calendar times.

Preview live runs in your timezone ↗

Monitor the completed work

Copy a private ping URL from a CronPulse check. Set its schedule to 0 0 1 JAN * in the same timezone as your job runner, and add grace for runtime and scheduling delay. Send success after the work finishes, not when it is enqueued.

Add success and exit-code reporting to crontab. Missing pings are evaluated once a minute; this is not sub-minute monitoring.

Questions

Which time zone does this use?
The examples use UTC. Choose your IANA time zone in the cron helper; your host scheduler must use the same zone.
Does cron wait for the last job to finish?
This expression chooses clock times. It does not provide locking or an elapsed timer. Configure concurrency in the job runner.

Related schedules

Cron twice a day

Cron every 20 minutes

Give your next job a heartbeat.

20 checks free. No card. Built in Ireland.

Create your first check ↗