ClockOrbit

Monthly

0 0 28-31 * *

Run at the end of every month (approximated by days 28-31).

This preview is live: the table below shows the actual next run times for 0 0 28-31 * * in your time zone, recomputed in your browser. Change the expression, dialect, or zone to experiment, then copy the result.

Next runs
valid
Upcoming runs
Sat, Nov 28 2026
00:00 UTC
in 21 days
Sun, Nov 29 2026
00:00 UTC
in 22 days
Mon, Nov 30 2026
00:00 UTC
in 23 days
Mon, Dec 28 2026
00:00 UTC
in 51 days
Tue, Dec 29 2026
00:00 UTC
in 52 days
Wed, Dec 30 2026
00:00 UTC
in 53 days
Thu, Dec 31 2026
00:00 UTC
in 54 days
Thu, Jan 28 2027
00:00 UTC
in 82 days
Fri, Jan 29 2027
00:00 UTC
in 83 days
Sat, Jan 30 2027
00:00 UTC
in 84 days
Sun, Jan 31 2027
00:00 UTC
in 85 days
Sun, Feb 28 2027
00:00 UTC
in 113 days
Sun, Mar 28 2027
00:00 UTC
in 141 days
Mon, Mar 29 2027
00:00 UTC
in 142 days
Tue, Mar 30 2027
00:00 UTC
in 143 days
Wed, Mar 31 2027
00:00 UTC
in 144 days
Wed, Apr 28 2027
00:00 UTC
in 172 days
Thu, Apr 29 2027
00:00 UTC
in 173 days
Fri, Apr 30 2027
00:00 UTC
in 174 days
Fri, May 28 2027
00:00 UTC
in 202 days
Sat, May 29 2027
00:00 UTC
in 203 days
Sun, May 30 2027
00:00 UTC
in 204 days
Mon, May 31 2027
00:00 UTC
in 205 days
Mon, Jun 28 2027
00:00 UTC
in 233 days
Tue, Jun 29 2027
00:00 UTC
in 234 days

What 0 0 28-31 * * means

The true last day of the month varies (28, 29, 30, or 31), and plain Unix cron cannot express "the last day" directly. The common workaround is 0 0 28-31 * * plus a one-line guard in the job that checks whether tomorrow is the 1st, only then does the real work run.

Month-end is when the books close: final reconciliations, end-of-month reports, and billing true-ups. Getting the "last day" right matters because firing a day early (always on the 28th) would close February correctly but every other month a few days too soon.

Field-by-field breakdown

Unix cron has five fields. Here is what each one is doing in this expression:

FieldValueMeaning
Minute0minute = 0
Hour0hour = 0
Day of month28-31the range 28-31 (inclusive) of day-of-month
Month*every month
Day of week*every day-of-week

Last day of the month in every scheduler

The same cadence written for the seven cron dialects you are most likely to meet. Copy the line for the system you target, the field count and day-of-week numbering differ between them.

SchedulerExpressionCopy
Unix / crontab0 0 28-31 * *
GitHub Actions0 0 28-31 * *
Kubernetes CronJob0 0 28-31 * *
Vercel Cron0 0 28-31 * *
Quartz0 0 0 28-31 * ? *
Spring0 0 0 28-31 * ?
AWS EventBridge0 0 28-31 * ? *

Dialect note: Quartz and EventBridge support L for last-day-of-month: 0 0 0 L * ? (Quartz), 0 0 L * ? * (EventBridge). Unix, GitHub Actions, Kubernetes, Spring, and Vercel need the 28-31 guard trick.

When you would use 0 0 28-31 * *

The gotcha worth knowing

0 0 28-31 * * fires on up to four days. Gate the real work with a check like [ "$(date -d tomorrow +%d)" = 01 ] so it runs only on the actual last day. Dialects with L (Quartz, EventBridge) avoid the hack entirely.

People also search for

cron last day of monthcron end of monthcrontab month endcron L last day

0 0 28-31 * * FAQ

What does the cron expression 0 0 28-31 * * mean?

0 0 28-31 * * means: Run at the end of every month (approximated by days 28-31). The true last day of the month varies (28, 29, 30, or 31), and plain Unix cron cannot express "the last day" directly. The common workaround is 0 0 28-31 * * plus a one-line guard in the job that checks whether tomorrow is the 1st, only then does the real work run.

How do I write "last day of the month" in GitHub Actions?

Use 0 0 28-31 * * in the schedule's cron field. 0 0 28-31 * * fires on up to four days. Gate the real work with a check like [ "$(date -d tomorrow +%d)" = 01 ] so it runs only on the actual last day. Dialects with L (Quartz, EventBridge) avoid the hack entirely.

How do I write "last day of the month" for AWS EventBridge?

EventBridge uses six fields with a required year and a ? placeholder in one day field: 0 0 28-31 * ? *. Wrap it as cron(0 0 28-31 * ? *) in the console or CloudFormation.

What is the Quartz equivalent of 0 0 28-31 * *?

Quartz is seconds-first with a trailing year, so the equivalent is 0 0 0 28-31 * ? *. Remember Quartz numbers Sunday as 1, the opposite of Unix.

Related cron patterns

More cron tools

Browse the full set of cron pattern pages, or jump to the interactive tools: the cron expression builder for designing a schedule from scratch, the cron cheat sheet for a side-by-side reference, the cron timezone translator for moving a schedule between zones and dialects, and the GitHub Actions cron picker for DST-stable CI schedules.