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
- 012026-07-15T00:00:00.000Z
- 022026-08-01T00:00:00.000Z
- 032026-08-15T00:00:00.000Z
- 042026-09-01T00:00:00.000Z
- 052026-09-15T00:00:00.000Z
- 062026-10-01T00:00:00.000Z
- 072026-10-15T00:00:00.000Z
- 082026-11-01T00:00:00.000Z
- 092026-11-15T00:00:00.000Z
- 102026-12-01T00:00:00.000Z
Variations
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.