Curated cron expression
First Day of Every Month Cron Expression: 0 0 1 * *
Learn the 0 0 1 * * monthly cron expression with field meaning, next-run dates, timezone and billing-boundary guidance, production gotchas, and platform conversions.
Meaning at a glance
0 0 1 * *
Run at midnight on the first day of each month
At 00:00 on January 1, February 1, March 1, and every other first day.
Next-run example: After April 1 at 00:01, the next nominal run is May 1 at 00:00.
How 0 0 1 * * works
The day-of-month value 1 restricts this schedule to the first calendar date, while minute and hour zero select midnight. It runs twelve times in a normal year.
Monthly billing and retention work often uses this expression, but a scheduled start is not a transaction boundary. Calculate the target month explicitly and make reruns safe.
| Field | Value | Meaning |
|---|---|---|
| Minute | 0 | At minute zero |
| Hour | 0 | At midnight |
| Day of month | 1 | First calendar day |
| Month | * | Every month |
| Day of week | * | Regardless of weekday |
Good use cases
- Monthly invoices
- Usage period rollover
- Retention cleanup
- Monthly reporting snapshot
Timezone and daylight-saving behavior
Use the same business timezone that defines the month in your database and customer contracts.
Month boundaries are calendar-based; the elapsed duration between runs varies with month length and can also vary by an hour across DST changes.
The expression does not contain a timezone. The scheduler supplies that context. Use the next-run preview above in the same IANA timezone as production, then confirm the target platform's own timezone rules.
Platform compatibility and converted expressions
The source expression is five-field Unix cron. Use the exact equivalent below rather than adding or removing fields by sight.
| Platform | Status | Expression | What to know |
|---|---|---|---|
| Unix crontab | Ready | 0 0 1 * * | Use directly in a normal five-field user crontab. |
| Kubernetes CronJob | Ready | 0 0 1 * * | Use as spec.schedule; set spec.timeZone when local wall-clock behavior matters. |
| GitHub Actions | Ready | 0 0 1 * * | Use under on.schedule; UTC is the default and an IANA timezone may be specified. |
| Vercel Cron Jobs | Ready | 0 0 1 * * | Valid once-per-month schedule on all current plans, evaluated at 00:00 UTC. |
| AWS EventBridge Scheduler | Convert | cron(0 0 1 * ? *) | Convert to AWS minute-first cron(...), add the required year, and use ? in one day field. |
| Spring @Scheduled | Convert | 0 0 0 1 * * | Use Spring’s six fields by prepending seconds and set zone explicitly when needed. |
| systemd timer | Convert | monthly | Use OnCalendar syntax and validate it with systemd-analyze calendar on the target host. |
Edge cases to check before deployment
- Do not model “every 30 days” with a monthly calendar expression; they are different schedules.
- A missed first-of-month run needs an explicit reconciliation path.
- Store the processed year-month so retries cannot create duplicate invoices.
Frequently asked questions
What does the cron expression 0 0 1 * * mean?
0 0 1 * * means “run at midnight on the first day of each month.” At 00:00 on January 1, February 1, March 1, and every other first day.
What are the next run times for 0 0 1 * *?
After April 1 at 00:01, the next nominal run is May 1 at 00:00. Exact timestamps depend on the scheduler timezone and the current time.
What timezone does 0 0 1 * * use?
Use the same business timezone that defines the month in your database and customer contracts.
Can I use 0 0 1 * * on every scheduling platform?
No. It is a five-field Unix expression. Some platforms accept it directly, while AWS EventBridge Scheduler, Spring, and systemd require the converted form shown in the compatibility table.