Skip to main content

Cron every other day

0 0 */2 * *

At 00:00, every 2 days.

Next runs · UTC

Calendar

September 2026 · UTC

0 runs

About this tool

Run a cron every other day with 0 0 */2 * *. The day-of-month step fires on every odd day (1, 3, 5, …) at midnight. The cadence resets at month boundaries - see the pitfalls section on the pillar guide for the workaround.

The cron expression for every other day

0 0 */2 * *

The day-of-month step */2 selects odd or even days - 1, 3, 5, 7, …, 29 (or 31). The cadence resets at the month boundary, so February going into March may produce two runs only one day apart. For strict 48-hour intervals, use a runtime check.

See the dedicated guide for the full breakdown: Cron every day.

Paste it into the editor above to see the next runs on a calendar.

When to run a job every other day

  • Backups and snapshots that can follow matching calendar dates despite the monthly reset.
  • Retention and archival jobs where a variable month-boundary gap is acceptable.
  • Calendar-date checks that do not require a fixed elapsed-time interval.

Run this cron anywhere

0 0 */2 * * is five-field cron syntax. It works as is in:

AWS EventBridge and Quartz use six-field expressions with a ? in one of the day fields, so convert first:

  • AWS EventBridge - cron(minute hour day-of-month month ? year); see the AWS guide.
  • Quartz Scheduler - prepend a seconds field (0) and replace one day field with ?; see the Quartz guide.

Useful variations

  • 0 9 */2 * * - every other day at 09:00
  • 0 0 2-30/2 * * - every other day starting from the 2nd (even days)

Gotchas when running every other day

  • The step resets every month - The day-of-month field restarts on the 1st, so the boundary gap varies with the month length and selected range instead of staying 2 days. For a strict interval, trigger daily in UTC and gate with epoch-day modulo 2.
  • Timezone and daylight saving - DST handling is scheduler-specific: Vixie/cronie can skip or double local matches; GitHub advances nonexistent local times; EventBridge Scheduler skips spring and runs once in the fall overlap. UTC-only Vercel and Cloudflare schedules are unaffected.

Examples

  • 0 18 * * *
    Every day at 18:00
  • 0 */5 * * *
    Every 5 hours
  • 0 18 * * 1-5
    Weekdays at 18:00
  • 0 0 1 * *
    Once a month, on the 1st at midnight

Cheatsheet

Full cheatsheet
FieldReq.RangeWildcards
minuteyes0-59, - * /
houryes0-23, - * /
day of monthyes1-31, - * /
monthyes1-12 or JAN-DEC, - * /
day of weekyes0-6 or names; some dialects use 0-7 or 1-7 — see Dialects, - * /

Frequently asked questions

Days and months

What state should a strict every-other-day wrapper persist?

Persist the next due UTC midnight, not the current calendar date. A daily UTC trigger runs only when due, then advances that timestamp by 172,800 seconds after success.

How do I run on strict alternate days across month boundaries?

Trigger daily in UTC and gate with day=$(( $(date +%s) / 86400 )); (( day % 2 == 0 )) || exit 0. Epoch-day parity continues across months and keeps selected UTC midnights 48 hours apart.

How do I choose which UTC day starts the alternating sequence?

Store an anchor Unix-day number and run when (day - anchor) % 2 == 0. This fixes the phase across month and year boundaries without relying on odd calendar dates.

Is date +%j parity safe for an every-other-day wrapper?

Not across New Year. Day-of-year resets to 001, so an odd/even test can select consecutive dates or leave a longer gap; use Unix epoch-day parity or persisted last-success state.

Timezones and DST

Can alternate local days be less or more than 48 hours apart?

Yes. Across DST, the same local time on alternate dates can be 47 or 49 elapsed hours apart. Use a UTC daily trigger and epoch-day parity for exact 48-hour spacing.

Timezone and DST reference

Platforms

What AWS EventBridge schedule should an alternate-day wrapper use?

Use cron(0 0 * * ? *) to trigger daily in UTC, then exit on the unwanted epoch-day parity. EventBridge cannot express a strict every-other-day interval with calendar fields alone. Expression: 0 0 * * ? *

Open in editor
AWS cron guide
What Quartz schedule should an alternate-day wrapper use?

Use 0 0 0 * * ? as a daily trigger, then apply epoch-day parity in the job. Quartz day-of-month steps also restart on the 1st. Expression: 0 0 0 * * ?

Open in editor
Quartz cron guide
Can GitHub Actions and Vercel Hobby run the daily wrapper?

Yes. A daily trigger is above GitHub Actions' five-minute floor and fits Vercel Hobby's once-per-day limit; both use UTC by default for these schedules.

Cron dialect matrix

Debugging

Should an alternate-day wrapper catch up after downtime?

Choose explicitly. Run once when the persisted due timestamp has passed to preserve work, or advance due dates without execution to preserve future phase; do not run every missed occurrence blindly.

How do I make an alternate-day state wrapper retry safely?

Lock before reading state and update the last-success timestamp only after completion. Otherwise overlapping attempts can both pass, or a failed attempt can suppress the next eligible run.

Crontap

Can Crontap run a strict alternate-day HTTP job?

Yes. Run a daily trigger on Crontap with retries and let the endpoint enforce epoch-day parity or a persisted last-success timestamp.

Schedule API calls

General

What is the cron expression for every other day?

0 0 */2 * * matches calendar dates 1, 3, …, 31 and resets on the 1st; it is not a strict 48-hour interval. For strict spacing, trigger daily in UTC and gate with epoch-day parity.

How can I verify which calendar dates this cron matches?

The editor shows the next 30+ matches on a calendar. Check dates around the 1st: this day-of-month step resets monthly, while a strict 48-hour cadence requires a daily UTC trigger and epoch-day parity.

Does 0 0 */2 * * work on every platform?

Linux cron, Vercel, node-cron, robfig, and Kubernetes accept this five-field calendar pattern, but it resets monthly everywhere. A strict 48-hour cadence needs a daily UTC trigger plus epoch-day parity; AWS EventBridge and Quartz require six-field conversions.

What happens if the previous run is still going when the next one fires?

Most schedulers will start the new run anyway, leading to overlap. To prevent this, wrap the command with flock -n /tmp/myjob.lock /path/to/script.sh on Linux, or set concurrencyPolicy: Forbid on Kubernetes CronJob. Vercel and EventBridge may overlap runs if the previous one is still executing; make the handler idempotent.

Write the cron here. Run it on Crontap.

Point Crontap at any URL. Pick any cron. Done.

WordPress, Shopify, Railway, Cloud Run, Vercel, HubSpot, Ghost, your own box. If it answers HTTP, Crontap can drive it on a clock you can read, in the timezone that actually matters, and page you when something breaks.

1.9k+ teams · Free forever tier · No credit card