cronuru
Pattern

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
  1. 012026-07-15T00:00:00.000Z
  2. 022026-08-15T00:00:00.000Z
  3. 032026-09-15T00:00:00.000Z
  4. 042026-10-15T00:00:00.000Z
  5. 052026-11-15T00:00:00.000Z
  6. 062026-12-15T00:00:00.000Z
  7. 072027-01-15T00:00:00.000Z
  8. 082027-02-15T00:00:00.000Z
  9. 092027-03-15T00:00:00.000Z
  10. 102027-04-15T00:00:00.000Z

Variations

0 0 1 * *

1st of every month

0 0 1,15 * *

1st and 15th of every month

0 0 L * ?

Last day of month (Quartz)

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.