# 0 0 28-31 * *

**At 00:00, on the 28th through 31st of the month**

- Expression: `0 0 28-31 * *`
- Timezone: UTC
- Frequency: approximately 4 runs per month (0.13/day)

## Fields

| Field | Value | Meaning |
| --- | --- | --- |
| Minute | `0` | At minute 0. |
| Hour | `0` | At 00:00. |
| Day of month | `28-31` | On the 28th, 29th, 30th and 31st. |
| Month | `*` | Every month. |
| Day of week | `*` | Every day of the week. |

## Next runs (UTC)

- Mon, 2026-09-28, 00:00 — `2026-09-28T00:00:00.000Z`
- Tue, 2026-09-29, 00:00 — `2026-09-29T00:00:00.000Z`
- Wed, 2026-09-30, 00:00 — `2026-09-30T00:00:00.000Z`
- Wed, 2026-10-28, 00:00 — `2026-10-28T00:00:00.000Z`
- Thu, 2026-10-29, 00:00 — `2026-10-29T00:00:00.000Z`

## Warnings

### Some months will be skipped (caution)

Standard cron does not clamp to the end of the month, so this skips the 30th (skipped in February) and the 31st (skipped in February, April, June, September and November) entirely rather than running on the last day.

**Fix:** To run on the last day of every month, schedule daily and guard the job with `[ "$(date -d tomorrow +%d)" = "01" ] || exit 0`.

### Interpreted in UTC (info)

A cron expression has no timezone of its own — the scheduler's zone decides when it fires. These times are computed in UTC. The same expression on a host in another zone runs at a different moment.

**Fix:** Set the schedule timezone explicitly (TZ= or CRON_TZ= in crontab, `timeZone` in Kubernetes, or the scheduler's own setting). Vercel Cron Jobs always run in UTC.

---

Canonical URL: https://crontoenglish.com/cron/last-day-of-the-month
JSON API: `GET https://crontoenglish.com/api/v1/explain?expression=...`
MCP endpoint: `https://crontoenglish.com/api/mcp`
