Curated cron expression
15th Day of Every Month Cron Expression: 0 0 15 * *
Understand 0 0 15 * * for the middle of every month, with a field breakdown, next-run behavior, timezone guidance, billing use cases, and scheduler conversions.
Meaning at a glance
0 0 15 * *
Run at midnight on the 15th of each month
Once per month at the start of the fifteenth day.
Next-run example: After June 15 at 00:01, the next nominal run is July 15 at 00:00.
How 0 0 15 * * works
The 15 in day-of-month selects the fifteenth calendar date. With minute and hour at zero, the job begins at midnight in the scheduler timezone.
Unlike schedules on the 29th, 30th, or 31st, the fifteenth exists in every month. It is therefore a predictable anchor for mid-month reports and semi-monthly workflows.
| Field | Value | Meaning |
|---|---|---|
| Minute | 0 | At minute zero |
| Hour | 0 | At midnight |
| Day of month | 15 | Fifteenth calendar day |
| Month | * | Every month |
| Day of week | * | Regardless of weekday |
Good use cases
- Mid-month payroll preparation
- Billing reminder
- Capacity snapshot
- Semi-monthly reconciliation
Timezone and daylight-saving behavior
A midnight run should use the timezone that defines the relevant accounting or reporting date.
The interval varies with month length. Local midnight normally exists, but its UTC equivalent can change after an offset transition.
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 15 * * | Use directly in a normal five-field user crontab. |
| Kubernetes CronJob | Ready | 0 0 15 * * | Use as spec.schedule; set spec.timeZone when local wall-clock behavior matters. |
| GitHub Actions | Ready | 0 0 15 * * | Use under on.schedule; UTC is the default and an IANA timezone may be specified. |
| Vercel Cron Jobs | Ready | 0 0 15 * * | Valid monthly schedule on all current plans, always evaluated in UTC. |
| AWS EventBridge Scheduler | Convert | cron(0 0 15 * ? *) | Convert to AWS minute-first cron(...), add the required year, and use ? in one day field. |
| Spring @Scheduled | Convert | 0 0 0 15 * * | Use Spring’s six fields by prepending seconds and set zone explicitly when needed. |
| systemd timer | Convert | *-*-15 00:00:00 | Use OnCalendar syntax and validate it with systemd-analyze calendar on the target host. |
Edge cases to check before deployment
- This does not mean every 15 days.
- If you need both the 1st and 15th, use 0 0 1,15 * * and make each period key explicit.
- A weekend or public holiday does not postpone the run to a business day.
Frequently asked questions
What does the cron expression 0 0 15 * * mean?
0 0 15 * * means “run at midnight on the 15th of each month.” Once per month at the start of the fifteenth day.
What are the next run times for 0 0 15 * *?
After June 15 at 00:01, the next nominal run is July 15 at 00:00. Exact timestamps depend on the scheduler timezone and the current time.
What timezone does 0 0 15 * * use?
A midnight run should use the timezone that defines the relevant accounting or reporting date.
Can I use 0 0 15 * * 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.