Skip to content
Deftkit

Cron Explainer — Read Any Cron Expression

Translate cron expressions into plain English and see the next fire times. Free, fast, runs entirely in your browser.

minute hour day-of-month month day-of-week

In plain English

At every 5 minutes past the hour, every hour.

Next 5 fire times (your local timezone)

#1Wed, Apr 8, 2026, 10:05:00 PMin 1 min
#2Wed, Apr 8, 2026, 10:10:00 PMin 6 min
#3Wed, Apr 8, 2026, 10:15:00 PMin 11 min
#4Wed, Apr 8, 2026, 10:20:00 PMin 16 min
#5Wed, Apr 8, 2026, 10:25:00 PMin 21 min
Show parsed fields
minute
0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55
hour
(all)
dom
(all)
month
(all)
dow
(all)

What is a cron expression?

A cron expression is a five-part schedule string used by Unix-style schedulers, CI systems, and serverless platforms to describe when a job should run. The five fields are minute, hour, day-of-month, month, and day-of-week, separated by spaces. Each field is either a specific value, a range, a list, an asterisk (any value), or a step expression. The combination tells cron exactly which minutes of which hours of which days the job should fire.

Cron is everywhere: GitHub Actions, GitLab CI, Vercel scheduled functions, Kubernetes CronJobs, AWS EventBridge, Linux crontab, macOS launchd (with a slightly different syntax), and any application that needs "run this every weekday morning at 9." The syntax is also notoriously hard to read at a glance — which is what this tool exists to fix.

The five fields

┌───────────── minute (0-59)
│ ┌───────────── hour (0-23)
│ │ ┌───────────── day of month (1-31)
│ │ │ ┌───────────── month (1-12 or JAN-DEC)
│ │ │ │ ┌───────────── day of week (0-6 or SUN-SAT, 0 is Sunday)
│ │ │ │ │
* * * * *

Each field accepts:

  • * — any value (every minute, every hour, etc.)
  • A specific number — 5 means minute 5, hour 5, etc.
  • A range — 1-5 means 1 through 5 inclusive
  • A list — 1,3,5 means exactly 1, 3, and 5
  • A step — */5 means every 5th value, starting from the field minimum. 1-30/5 means every 5th value from 1 to 30 (so 1, 6, 11, 16, 21, 26)
  • For month and day-of-week, three-letter aliases work too — JAN, MON, etc. (case-insensitive)

Common patterns

* * * * *           Every minute
*/5 * * * *         Every 5 minutes
*/15 * * * *        Every 15 minutes
0 * * * *           Every hour, on the hour
0 */2 * * *         Every 2 hours
0 0 * * *           Every day at midnight
0 9 * * *           Every day at 09:00
0 9 * * 1-5         Weekdays at 09:00
0 9 * * MON-FRI     Same thing, with day aliases
0 0 1 * *           First of every month at midnight
0 0 * * 0           Every Sunday at midnight
0 0 1 1 *           Once a year on January 1
30 14 * * *         Every day at 14:30
0 */4 * * *         Every 4 hours starting at midnight
*/10 9-17 * * 1-5   Every 10 minutes during business hours, weekdays

The OR rule for day fields

The most surprising thing about cron is the relationship between the day-of-month and day-of-week fields. When BOTH are restricted (i.e., neither is *), the schedule fires when EITHER matches, not when both match.

Example: 0 0 13 * 5means "midnight on the 13th of any month, OR midnight on any Friday" — NOT just "midnight on Friday the 13th." If you want the AND interpretation, you have to use a tool that supports it (some schedulers like Quartz add a special L or W modifier) or filter inside the job itself.

This explainer surfaces the OR semantics in the plain-English translation when both day fields are restricted, so you can spot the gotcha at a glance.

Special @aliases

Most cron implementations also accept these shortcuts:

@yearly    same as  0 0 1 1 *     (once a year, midnight Jan 1)
@annually  same as  @yearly
@monthly   same as  0 0 1 * *     (once a month, midnight on the 1st)
@weekly    same as  0 0 * * 0     (once a week, midnight on Sunday)
@daily     same as  0 0 * * *     (once a day, midnight)
@midnight  same as  @daily
@hourly    same as  0 * * * *     (once an hour, on the hour)

This tool accepts the @aliases and expands them to the equivalent five-field form before parsing.

How this tool works

  1. Type or paste your cron expression — or click one of the presets for a starting point
  2. The plain-English description appears immediately below
  3. The next 5 fire times are computed in your local timezone, with a "in N minutes" relative offset for quick scanning
  4. Click Show parsed fields to see the expanded value list for each of the 5 fields — useful for debugging ranges and steps
  5. Click Copy expression to put the cron string on your clipboard

What this tool does and does not do

  • Supports: 5-field cron, ranges (1-5), lists (1,3,5), steps (*/5 and 1-30/5), month and day-of-week aliases, and the special @aliases
  • Does not support: 6-field expressions (with seconds), Quartz-style 7-field expressions, L (last) or W (weekday) modifiers, # (nth occurrence) syntax, year fields, or random (R) syntax. These are platform-specific extensions
  • Timezone: next-fire times are computed in your browser's local timezone. If your cron job actually runs on a server in UTC or another zone, the rendered times will differ by your offset

Privacy

Everything happens in your browser. The cron expression you type is never sent anywhere — there is no log of which schedules people enter, no analytics on the input. Safe for production schedules from internal CI configs.

Frequently asked questions

Why does my schedule say it fires more often than I expected?

The most common cause is forgetting that * means "every". * * * * * fires every minute, not once. The second most common cause is the OR rule for day-of-month and day-of-week — see the section above.

What timezone does cron use?

That depends entirely on the platform running cron, not on the cron expression itself. Linux crontab uses the system timezone (often UTC on servers). GitHub Actions cron uses UTC. Vercel cron uses UTC. Kubernetes CronJob uses the cluster's timezone. AWS EventBridge defaults to UTC. Always check your platform's docs and remember that 0 9 * * * means 9am in the platform's timezone, not yours.

What's the smallest interval cron supports?

One minute, in standard 5-field cron. Some platforms support sub-minute scheduling (Quartz with seconds, AWS EventBridge with rate expressions, etc.) but those are extensions. If you need sub-minute scheduling, cron is the wrong tool — use a job queue or a long-running process with sleep loops instead.

Why does 0 0 * * MON-FRI not fire on weekends?

That's the correct behavior — Monday through Friday excludes Saturday and Sunday. If you want it to fire every day including weekends, use 0 0 * * *.

Is it 0 = Sunday or 0 = Monday in the day-of-week field?

In standard cron, 0 = Sunday. Some platforms also accept 7 as Sunday for compatibility. Day numbering goes Sun=0, Mon=1, Tue=2, ..., Sat=6. This trips up people who came from ISO-8601 (which counts Mon=1, Sun=7).

Can I schedule something for the last day of the month?

Not in standard cron. The L modifier (e.g. 0 0 L * *) exists in Quartz and some other extensions but is not portable. The standard workaround is to schedule for the 28th, 29th, 30th, and 31st separately, then have the job check if it's really the last day before doing work.

Is my data sent anywhere?

No — cron parsing and next-fire-time calculation happen entirely in your browser. No upload, no log, no analytics on the expressions you test.