cronuru
Pattern

First Day of Month

0 0 1 * *
0 0 0 1 * ?
0 0 1 * *
0 0 1 * ? *
0 0 0 1 * *
0 0 1 * *

Runs at 00:00 on the 1st of every month — 12 invocations per year.

Use in your stack

# First day of every month at midnight
0 0 1 * * /usr/local/bin/monthly-billing.sh

# Equivalent shortcut (Linux crontab)
@monthly /usr/local/bin/monthly-billing.sh
{ "cron": "0 0 0 1 * ?", "timezone": "UTC" }
apiVersion: batch/v1
kind: CronJob
metadata:
  name: monthly-billing
spec:
  schedule: "0 0 1 * *"
  timeZone: "UTC"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: billing
            image: my-image:latest
          restartPolicy: OnFailure
cron(0 0 1 * ? *)
@Scheduled(cron = "0 0 0 1 * *")
public void monthlyJob() { /* ... */ }
on:
  schedule:
    - cron: '0 0 1 * *'

Next runs

Pick a timezone to see when this expression fires next.

Next 10 runs
  1. 012026-08-01T00:00:00.000Z
  2. 022026-09-01T00:00:00.000Z
  3. 032026-10-01T00:00:00.000Z
  4. 042026-11-01T00:00:00.000Z
  5. 052026-12-01T00:00:00.000Z
  6. 062027-01-01T00:00:00.000Z
  7. 072027-02-01T00:00:00.000Z
  8. 082027-03-01T00:00:00.000Z
  9. 092027-04-01T00:00:00.000Z
  10. 102027-05-01T00:00:00.000Z

Variations

0 0 15 * *

15th of every month

0 0 1,15 * *

1st and 15th of every month

0 0 L * ?

Last day of every month (Quartz syntax)

0 0 1 */3 *

Quarterly (1st of every 3rd month)

0 0 1 1 *

Yearly (January 1st)

Common use cases

  • Monthly billing runs or invoice generation.
  • Calendar-month reports (usage, revenue, KPIs).
  • Rotating monthly credentials or secrets.
  • Archiving the previous month's data and starting a fresh window.

Gotchas

  • On Linux crontab, `@monthly` is shorthand for `0 0 1 * *`. Kubernetes CronJob accepts it; GitHub Actions does not.
  • AWS EventBridge: `0 0 1 * ? *` — uses `?` for day-of-week.
  • Months have different numbers of days, but the 1st always exists — this is one of the safer date-anchored schedules.
  • If you want the last day of the month instead, see the [last-day-of-month pattern](/last-day-of-month) — Unix cron can't express it directly.

0 0 1 * * is the monthly cron. The 1st of the month is one of the safest date anchors — it exists in every month, in every year, in every timezone. For end-of-month scheduling, see last-day-of-month — that’s where it gets tricky.

Frequently asked questions

What does `0 0 1 * *` mean?
Minute `0`, hour `0` (midnight), day-of-month `1`, month `*` (any), day-of-week `*` (any). So the job fires at midnight on the 1st day of every month — 12 invocations per year.
Is `0 0 1 * *` the same as `@monthly`?
Yes, on systems that support the shortcut. Linux crontab, anacron, and Kubernetes CronJob all accept `@monthly`. GitHub Actions does not — use the full expression.
What's the Quartz equivalent?
`0 0 0 1 * ?` — six fields (seconds at front), with `?` in day-of-week because day-of-month is set. Quartz requires `?` in one of the two day fields to break ambiguity.
Will this work if my timezone has a DST transition on the 1st?
Yes — the 1st of the month always exists, regardless of DST. The job fires at the configured midnight in the timezone you've pinned. If your timezone has a DST transition late on the 1st, the timing is correct because the transition typically happens at 2 AM or 3 AM.

Browse all cron patterns

Every schedule Cronuru documents, with its expression and code snippets for six dialects.