Cron Expression Explainer

Paste a cron expression and get a plain-English explanation. Supports standard 5-field and 6-field (with seconds) cron formats.

Examples (click to try)

How to use

  1. Type or paste a cron expression into the input above.
  2. Read the plain-English explanation that appears underneath.
  3. Click any example chip to drop it in the input and see it decoded.
  4. Fix any parse error shown in red and iterate until the explanation matches your intent.

What does it do?

The explainer takes a standard Unix cron expression (5 fields) or a Quartz-style expression with seconds (6 fields) and returns a human description such as "At 09:00 AM, Monday through Friday." It supports the common operators — *, ,, -, and / — along with named months (JAN-DEC) and named days of week (SUN-SAT). The result updates on every keystroke so you can iterate on an expression quickly.

Example

A common business-hours job:

0 9 * * MON-FRI

Decoded:

At 09:00 AM, Monday through Friday

A more specific 6-field Quartz expression with seconds:

0 30 2 ? * MON

Decoded (every Monday at 02:30:00).

Cron format

┌───────── 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 and 7 both mean Sunday)
│ │ │ │ │
* * * * *

Why does cron "0 0 * * *" fire at midnight UTC not my local time?

Most real cron bugs fall into a handful of recurring traps:

  • Timezone drift. 0 0 * * * fires at midnight in the scheduler's timezone. On Kubernetes CronJobs and GitHub Actions that defaults to UTC — set spec.timeZone or convert the hour to UTC yourself.
  • 5-field vs 6-field mismatch. Pasting 0 0 9 * * MON-FRI (6 fields) into a 5-field scheduler reads the leading 0 as the minute and 0 as the hour, so the job fires at midnight, not 09:00.
  • Day-of-month and day-of-week together. 0 0 15 * MON runs on the 15th and every Monday — not only on a Monday that falls on the 15th. This is Vixie-cron's OR semantics.
  • Step does not restart on deploy. */10 * * * * fires at :00, :10, :20, :30, :40, :50 on the clock — not ten minutes after your last deploy.
  • Using ? in standard cron. The ? placeholder is a Quartz extension. Unix cron rejects it — use * instead.
  • Day-of-week 0 vs 7. Both mean Sunday in classic cron, but some parsers (old BSD) accept only 0. If portability matters, use SUN.

Operators

  • * — any value
  • , — list of values (e.g. MON,WED,FRI)
  • - — range (e.g. 1-5)
  • / — step values (e.g. */15 = every 15)

Is my data private?

Yes. We don't save any cron expression you test here. Nothing is stored, logged, or retained — whatever you type is gone as soon as you close or refresh the tab. There's no record on our side of what schedules you're working on. You're welcome to verify in your browser's developer tools.

Frequently asked questions

What is the difference between 5-field and 6-field cron?

Standard POSIX cron has 5 fields: minute, hour, day-of-month, month, day-of-week. The 6-field variant prepends a seconds field and is used by Quartz, Spring @Scheduled, and many Node cron libraries. A 6-field expression like "0 0 9 * * MON-FRI" fires at 9:00:00 on weekdays, while the 5-field "0 9 * * MON-FRI" fires at 9:00.

Does this support Quartz extensions like L, W, and #?

This explainer supports the common Unix / Vixie cron dialect plus the optional leading seconds field. Quartz-only tokens (L for last, W for weekday, # for nth weekday, and the ? placeholder) are not part of standard cron and are not guaranteed to parse. If you rely on them, use the scheduler-specific documentation to verify the expression.

Why does 0 0 * * * fire at a different time than I expect?

Cron expressions have no timezone. The job runs at midnight in the timezone of the machine or container that owns the scheduler. On Kubernetes CronJobs, GitHub Actions, and AWS EventBridge that defaults to UTC. If you want local midnight, set the scheduler timezone explicitly (spec.timeZone on CronJob, TZ env var, cron.yaml timezone key).

Can I combine day-of-month and day-of-week?

In standard Vixie cron, if both day-of-month and day-of-week are restricted, the job fires when either matches — it is an OR, not an AND. So "0 0 15 * MON" runs on the 15th of every month and every Monday. Quartz inverts this and treats one field as required to be "?" to disambiguate.

How do step values work?

A step uses the syntax range/step. "*/15 * * * *" fires every 15 minutes starting at :00. "10-50/20" inside the minutes field fires at :10, :30, :50. Step does not mean "every N from now" — the boundaries are always aligned to the start of the range, so do not expect a step to drift with the current time.

Do you save the cron expressions I test here?

No. We don't keep any record of the expressions you type. Whatever you paste or experiment with is discarded when you close or refresh the page — no logs, no analytics on the schedules you work on. You can check your browser's developer tools if you want extra reassurance.

Related tools