cronuru
Pattern

1st and 15th of Every Month

0 0 1,15 * *
0 0 0 1,15 * ?
0 0 1,15 * *
0 0 1,15 * ? *
0 0 0 1,15 * *
0 0 1,15 * *

Runs at 00:00 on the 1st and 15th of every month — 24 invocations per year, the semi-monthly cadence.

Use in your stack

# 1st and 15th of every month at midnight
0 0 1,15 * * /usr/local/bin/payroll.sh
{ "cron": "0 0 0 1,15 * ?", "timezone": "America/New_York" }
apiVersion: batch/v1
kind: CronJob
metadata:
  name: payroll
spec:
  schedule: "0 0 1,15 * *"
  timeZone: "America/New_York"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: payroll
            image: my-image:latest
          restartPolicy: OnFailure
cron(0 0 1,15 * ? *)
@Scheduled(cron = "0 0 0 1,15 * *", zone = "America/New_York")
public void semiMonthly() { /* ... */ }
on:
  schedule:
    - cron: '0 0 1,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-01T00:00:00.000Z
  3. 032026-08-15T00:00:00.000Z
  4. 042026-09-01T00:00:00.000Z
  5. 052026-09-15T00:00:00.000Z
  6. 062026-10-01T00:00:00.000Z
  7. 072026-10-15T00:00:00.000Z
  8. 082026-11-01T00:00:00.000Z
  9. 092026-11-15T00:00:00.000Z
  10. 102026-12-01T00:00:00.000Z

Variations

0 0 1 * *

1st of every month

0 0 15 * *

15th of every month

0 0 L * ?

Last day of month (Quartz)

Common use cases

  • Semi-monthly payroll processing.
  • Bi-monthly billing or invoicing runs.
  • Mid-month and start-of-month reconciliation.
  • Twice-a-month report generation on fixed dates.

Gotchas

  • The comma list `1,15` in the day-of-month field produces the two firing dates. Both dates always exist in every month.
  • AWS EventBridge: `0 0 1,15 * ? *` — uses `?` for day-of-week.
  • This is date-based, not day-of-week-based — it fires on the 1st and 15th regardless of which weekday they fall on.

0 0 1,15 * * is the semi-monthly schedule — the 1st and the 15th, every month. The comma list in the day-of-month field is the cleanest way to express fixed twice-monthly dates, which is exactly why it’s the go-to payroll cron.

Frequently asked questions

What does `0 0 1,15 * *` mean?
Minute `0`, hour `0` (midnight), day-of-month `1,15` (a comma list — the 1st and the 15th), month `*` (any), day-of-week `*` (any). So the job fires at midnight on the 1st and 15th of every month — twice a month, 24 times a year.
Why is this the payroll schedule?
Many US employers pay semi-monthly on the 1st and 15th (or 15th and last day). `0 0 1,15 * *` matches the 1st-and-15th convention exactly — fixed calendar dates, twice a month. For 15th-and-last-day, you'd combine `0 0 15 * *` with a last-day-of-month expression.
Does it fire on the 1st and 15th even on weekends?
Yes — this is purely date-based. It fires on the 1st and 15th regardless of weekday. If you need it to land on a business day instead, gate inside your script (skip and run the next weekday), or use Quartz's `W` character for nearest-weekday behavior.
How do I add a third date, like the 1st, 15th, and last day?
Extend the comma list for the fixed dates (`0 0 1,15 * *`), but last-day-of-month can't go in the same Unix expression because it's not a fixed number. Run a second cron for the last day, or move to Quartz where `0 0 0 1,15,L * ?` combines all three.

Browse all cron patterns

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