Cron Expression Explainer

Type or paste a cron expression — or a whole crontab — to see what it means in words and exactly when it will fire next. Everything is computed in your browser.

Input

Settings

History

Load from URL

What you get

For every schedule the page shows three things: the expression itself, a plain-English description such as “Every 15 minutes, between 09:00 and 17:59, Monday through Friday”, and the next ten run times as ISO 8601 timestamps with the weekday. A summary above the output repeats the meaning, the detected dialect, the time zone and the very next run; the Table view lists the run times so you can scan or export them.

The engine is cronstrue + cron-parser: cronstrue writes the description, cron-parser computes the dates, and PasteKit adds validation with precise positions plus the rules neither library covers on its own (the nearest-weekday W, LW and Quartz year ranges).

Three dialects are recognised automatically by the number of fields:

  • 5 fields — standard Unix cron and most schedulers: minute, hour, day of month, month, day of week.
  • 6 fields — seconds first, as in Spring @Scheduled, node-cron and many libraries.
  • 7 fields — Quartz, with seconds first and a year last; day of week runs 1–7 from Sunday.

The macros @yearly, @annually, @monthly, @weekly, @daily, @midnight and @hourly are expanded and shown next to their five-field equivalents, and @reboot is explained even though it has no calendar times.

Crontab files and the time zone option

You can paste an entire crontab. Comment lines starting with # and variable lines such as [email protected] or CRON_TZ=... are skipped, and anything after the schedule fields is shown as the command, so you can check a server’s jobs at a glance.

Time zone for next runs sets the IANA zone used to compute the run times, for example Asia/Singapore, Europe/London or America/New_York. It defaults to UTC. Cron daemons use the server’s local zone unless told otherwise, GitHub Actions schedules are always UTC, and Kubernetes CronJobs follow the controller manager’s zone (usually UTC) unless .spec.timeZone is set — so set this to whatever the system running the job uses. Daylight-saving transitions are applied, which is the quickest way to see whether a 02:30 job will be skipped or doubled in spring and autumn.

Ctrl/Cmd+Enter recalculates, Ctrl/Cmd+Shift+C copies the explanation and Ctrl/Cmd+K opens the command palette. Ctrl/Cmd+Shift+M (minify) has no meaning for cron.

Validation that catches real mistakes

Every field is checked against its range, and the error points at the exact character: a minute of 60, a range that runs backwards like 17-9, a step of zero, or a month name that does not exist. Schedules that can never fire, such as the 30th of February, are rejected with a message naming the month instead of silently producing no runs.

Quartz expressions get an extra check: Quartz expects ? in either day-of-month or day-of-week. If both are set, PasteKit warns that either day will match. That OR rule is also standard cron behaviour whenever both day fields are restricted, and it surprises people: 0 0 1,15 * 1 runs on the 1st, the 15th and every Monday. The cron syntax cheat sheet covers this and the special characters in more depth.

Examples

A crontab with commands and comments

Three schedules are explained separately, each with its command; the comment and MAILTO lines are skipped.

Input
# m h dom mon dow command
[email protected]
30 2 * * * /usr/local/bin/backup.sh --full
*/5 * * * * /usr/local/bin/healthcheck > /dev/null 2>&1
@weekly /usr/local/bin/rotate-logs
Output
30 2 * * *
  At 02:30
  Command: /usr/local/bin/backup.sh --full
  Next 10 runs (UTC):
    2026-10-06T02:30:00Z  Tue
    2026-10-07T02:30:00Z  Wed
    2026-10-08T02:30:00Z  Thu
    2026-10-09T02:30:00Z  Fri
    2026-10-10T02:30:00Z  Sat
    2026-10-11T02:30:00Z  Sun
    2026-10-12T02:30:00Z  Mon
    2026-10-13T02:30:00Z  Tue
    2026-10-14T02:30:00Z  Wed
    2026-10-15T02:30:00Z  Thu

*/5 * * * *
  Every 5 minutes
  Command: /usr/local/bin/healthcheck > /dev/null 2>&1
  Next 10 runs (UTC):
    2026-10-06T01:25:00Z  Tue
    2026-10-06T01:30:00Z  Tue
    2026-10-06T01:35:00Z  Tue
    2026-10-06T01:40:00Z  Tue
    2026-10-06T01:45:00Z  Tue
    2026-10-06T01:50:00Z  Tue
    2026-10-06T01:55:00Z  Tue
    2026-10-06T02:00:00Z  Tue
    2026-10-06T02:05:00Z  Tue
    2026-10-06T02:10:00Z  Tue

@weekly  (= 0 0 * * 0)
  At 00:00, only on Sunday
  Command: /usr/local/bin/rotate-logs
  Next 10 runs (UTC):
    2026-10-11T00:00:00Z  Sun
    2026-10-18T00:00:00Z  Sun
    2026-10-25T00:00:00Z  Sun
    2026-11-01T00:00:00Z  Sun
    2026-11-08T00:00:00Z  Sun
    2026-11-15T00:00:00Z  Sun
    2026-11-22T00:00:00Z  Sun
    2026-11-29T00:00:00Z  Sun
    2026-12-06T00:00:00Z  Sun
    2026-12-13T00:00:00Z  Sun
Open this example in the tool

Quartz expression in Singapore time

Seven fields are detected as Quartz; the year field limits the runs to 2027 and times carry the +08:00 offset.

Input
0 0 12 ? * MON-FRI 2027
Output
0 0 12 ? * MON-FRI 2027
  At 12:00, Monday through Friday, only in 2027
  Next 10 runs (Asia/Singapore):
    2027-01-01T12:00:00+08:00  Fri
    2027-01-04T12:00:00+08:00  Mon
    2027-01-05T12:00:00+08:00  Tue
    2027-01-06T12:00:00+08:00  Wed
    2027-01-07T12:00:00+08:00  Thu
    2027-01-08T12:00:00+08:00  Fri
    2027-01-11T12:00:00+08:00  Mon
    2027-01-12T12:00:00+08:00  Tue
    2027-01-13T12:00:00+08:00  Wed
    2027-01-14T12:00:00+08:00  Thu
Open this example in the tool

Special characters L, W and #

The last day of each month, the weekday nearest the 15th, and the third Friday of every month.

Input
0 0 L * *
0 9 15W * *
0 10 * * 5#3
Output
0 0 L * *
  At 00:00, on the last day of the month
  Next 10 runs (UTC):
    2026-10-31T00:00:00Z  Sat
    2026-11-30T00:00:00Z  Mon
    2026-12-31T00:00:00Z  Thu
    2027-01-31T00:00:00Z  Sun
    2027-02-28T00:00:00Z  Sun
    2027-03-31T00:00:00Z  Wed
    2027-04-30T00:00:00Z  Fri
    2027-05-31T00:00:00Z  Mon
    2027-06-30T00:00:00Z  Wed
    2027-07-31T00:00:00Z  Sat

0 9 15W * *
  At 09:00, on the weekday nearest day 15 of the month
  Next 10 runs (UTC):
    2026-10-15T09:00:00Z  Thu
    2026-11-16T09:00:00Z  Mon
    2026-12-15T09:00:00Z  Tue
    2027-01-15T09:00:00Z  Fri
    2027-02-15T09:00:00Z  Mon
    2027-03-15T09:00:00Z  Mon
    2027-04-15T09:00:00Z  Thu
    2027-05-14T09:00:00Z  Fri
    2027-06-15T09:00:00Z  Tue
    2027-07-15T09:00:00Z  Thu

0 10 * * 5#3
  At 10:00, on the third Friday of the month
  Next 10 runs (UTC):
    2026-10-16T10:00:00Z  Fri
    2026-11-20T10:00:00Z  Fri
    2026-12-18T10:00:00Z  Fri
    2027-01-15T10:00:00Z  Fri
    2027-02-19T10:00:00Z  Fri
    2027-03-19T10:00:00Z  Fri
    2027-04-16T10:00:00Z  Fri
    2027-05-21T10:00:00Z  Fri
    2027-06-18T10:00:00Z  Fri
    2027-07-16T10:00:00Z  Fri
Open this example in the tool

Spring-style schedule with seconds

Six fields mean seconds come first: every ten minutes during office hours on weekdays, London time.

Input
0 */10 8-18 * * MON-FRI
Output
0 */10 8-18 * * MON-FRI
  Every 10 minutes, between 08:00 and 18:59, Monday through Friday
  Next 10 runs (Europe/London):
    2026-10-06T08:00:00+01:00  Tue
    2026-10-06T08:10:00+01:00  Tue
    2026-10-06T08:20:00+01:00  Tue
    2026-10-06T08:30:00+01:00  Tue
    2026-10-06T08:40:00+01:00  Tue
    2026-10-06T08:50:00+01:00  Tue
    2026-10-06T09:00:00+01:00  Tue
    2026-10-06T09:10:00+01:00  Tue
    2026-10-06T09:20:00+01:00  Tue
    2026-10-06T09:30:00+01:00  Tue
Open this example in the tool

Common errors and how to fix them

ErrorCauseFix
A cron expression needs 5 fields (minute hour day-of-month month day-of-week); this has 4
Explained
A field is missing, or two fields were merged by a missing space.Use * for “every”, for example 0 9 * * 1-5 for 09:00 on weekdays.
Minute value 60 is out of range 0–59
Explained
Minutes run 0–59, hours 0–23, days 1–31 and months 1–12.Use 0 with the next hour instead of 60, or */30 for twice an hour.
Hour range 17-9 goes backwardsA range has to be written low-high; cron does not wrap around midnight.Write 9-17, or split an overnight window into a list such as 17-23,0-9.
This schedule never runs: day 30 does not occur in FebruaryThe day-of-month and month fields together describe a date that does not exist.Use L for the last day of the month, or pick a day that exists in every month you list.
Unknown cron macro "@every"@every 5m is a Go-library extension, not part of cron.Write */5 * * * *, or use one of @yearly, @monthly, @weekly, @daily, @hourly or @reboot.
Unknown time zone "Mars/Olympus"The Time zone for next runs option is not a valid IANA zone name.Use a name such as UTC, Europe/London, America/New_York or Asia/Singapore.

Frequently asked questions

Is day of week 0 Sunday or Monday?

In standard and 6-field cron, 0 and 7 are both Sunday and 1 is Monday. In 7-field Quartz expressions, 1 is Sunday and 7 is Saturday. Names like MON-FRI avoid the ambiguity.

What time zone does cron use?

Classic cron uses the server’s local time and GitHub Actions uses UTC. Set the time zone option to match whichever system actually runs your job.

How do I run a job every 90 minutes?

A single cron expression cannot do it, because steps restart every hour. Use two lines, such as 0 0-21/3 * * * and 30 1-22/3 * * *.

Can I paste my whole crontab?

Yes. Comments and variable lines are skipped, and each schedule is explained along with its command.

Does it support AWS EventBridge cron?

EventBridge uses six fields without seconds (minutes through year). Drop the cron( ) wrapper and add a leading 0 for seconds to read it here as a Quartz-style 7-field expression.

Related tools