15th of Every Month
0 0 15 * * 0 0 0 15 * ? 0 0 15 * * 0 0 15 * ? * 0 0 0 15 * * 0 0 15 * * Runs at 00:00 on the 15th of every month — 12 invocations per year, the mid-month cadence.
Use in your stack
# 15th of every month at midnight
0 0 15 * * /usr/local/bin/mid-month-billing.sh
{ "cron": "0 0 0 15 * ?", "timezone": "UTC" }
apiVersion: batch/v1
kind: CronJob
metadata:
name: mid-month-billing
spec:
schedule: "0 0 15 * *"
timeZone: "UTC"
jobTemplate:
spec:
template:
spec:
containers:
- name: billing
image: my-image:latest
restartPolicy: OnFailure
cron(0 0 15 * ? *)
@Scheduled(cron = "0 0 0 15 * *")
public void midMonth() { /* ... */ }
on:
schedule:
- cron: '0 0 15 * *'
Next runs
Pick a timezone to see when this expression fires next.
Next 10 runs
- 012026-07-15T00:00:00.000Z
- 022026-08-15T00:00:00.000Z
- 032026-09-15T00:00:00.000Z
- 042026-10-15T00:00:00.000Z
- 052026-11-15T00:00:00.000Z
- 062026-12-15T00:00:00.000Z
- 072027-01-15T00:00:00.000Z
- 082027-02-15T00:00:00.000Z
- 092027-03-15T00:00:00.000Z
- 102027-04-15T00:00:00.000Z
Variations
Common use cases
- Mid-cycle billing or invoicing.
- Monthly reports timed away from the 1st-of-month load spike.
- Mid-month reconciliation or audits.
- Recurring monthly jobs anchored to mid-month.
Gotchas
- The 15th always exists in every month, so this is a safe date anchor (unlike the 29th-31st).
- AWS EventBridge: `0 0 15 * ? *` — uses `?` for day-of-week.
- This is date-based — it fires on the 15th regardless of which weekday it falls on.
0 0 15 * * is the mid-month schedule — the 15th of every month, a safe date anchor that exists in all 12 months. Common for billing and reports deliberately timed away from the 1st-of-month rush.
Frequently asked questions
What does `0 0 15 * *` mean?
Minute `0`, hour `0` (midnight), day-of-month `15`, month `*` (any), day-of-week `*` (any). So the job fires at midnight on the 15th of every month — 12 times a year.
Is the 15th always a safe date?
Yes. Unlike the 29th, 30th, or 31st (which don't exist in every month), the 15th exists in all 12 months. It's one of the safest date anchors for a monthly cron, alongside the 1st.
How do I run on the 15th only if it's a weekday?
Standard Unix cron can't do this directly — if you set both day-of-month and day-of-week, they're OR'd, not AND'd. Schedule on the 15th and gate inside your script with a weekday check, or use Quartz's `15W` (nearest weekday to the 15th) in the day-of-month field.
How is this different from `0 0 1,15 * *`?
`0 0 15 * *` fires once a month (the 15th only). `0 0 1,15 * *` fires twice a month (the 1st and the 15th). The comma list adds the second date — see the 1st-and-15th pattern for the semi-monthly version.
Browse all cron patterns
Every schedule Cronuru documents, with its expression and code snippets for six dialects.