Skip to main content
QUIETLYTIC
Developer

Cron Expression Parser

Read a cron expression in plain English and see when it next fires.

Local · nothing leaves this browser Waiting for input
Esc Clear
Schedule

Paste a cron expression on the left.

How it works

Five fields, or six when the first one is seconds: minute, hour, day of month, month, day of week. Reading one is mostly mechanical. One rule inside it is not, and it is the rule that makes schedules misfire.

The two day fields are OR, not AND

0 0 13 * FRI does not mean Friday the 13th. When both the day-of-month and day-of-week fields are restricted, cron fires on any day matching either — so that expression runs on the 13th of every month and on every Friday, roughly sixty times a year instead of one or two. This is Vixie cron's behaviour, which is what crontab, most container schedulers and Cloudflare's own triggers implement. Whenever both fields are set, the output says so before it says anything else.

A cron expression has no timezone

There is no field for one. Run times here are computed in UTC and shown with your local equivalent beside them, labelled — but what your own server does depends on how that machine is configured, which the expression cannot tell you and this page will not guess.

Steps are not always what they look like

*/15 in the minutes field is 0, 15, 30, 45. 5/15 is 5, 20, 35, 50 — a bare value with a step starts there and runs to the end of the range. And 0,15,30 is a list, not a step: it stops before the end of the hour, so it is described as three times rather than as "every 15 minutes".

Example

@daily expands to 0 0 * * *. 0 0 29 2 * next fires on 29 February 2028 — found by stepping days rather than seconds, which is why a four-year gap costs nothing. 0 0 30 2 * returns no runs at all, because 30 February does not occur.

Frequently asked questions

Does 0 0 13 * FRI mean Friday the 13th?

No, and this is the single most common way a cron schedule turns out to run far more often than intended. When both the day-of-month and day-of-week fields are restricted, cron fires on days matching either one — so that expression runs on the 13th of every month and on every Friday. The tool says so explicitly whenever both fields are set.

Which timezone are the next run times in?

UTC, with your local equivalent shown beside each one. A cron expression has no timezone field, so the answer for your own server depends on how that machine is configured — the tool cannot know it and does not pretend to.

Does it support the six-field form with seconds?

Yes. Five fields is standard crontab; six means the first one is seconds, which is what Quartz, Spring and several container schedulers use. The tool reports which form it read so a misplaced field shows up as a wrong description rather than a silent hour shift.

Why is 5/15 not the same as */15?

A bare value with a step starts at that value and runs to the end of the range, so 5/15 in the minutes field is 5, 20, 35 and 50 — not 0, 15, 30, 45. It is a small difference that moves every run by five minutes.

It found no run times for my expression — is that a bug?

Probably not. Some expressions are satisfiable only in theory: 0 0 30 2 * asks for 30 February, which never occurs. The tool searches eight years ahead and reports finding nothing rather than inventing a date or spinning.

Does this work for a GitHub Actions on.schedule cron?

Yes — GitHub Actions workflow schedules use the same standard five-field crontab syntax this tool already parses, always in UTC, so paste the value straight from a workflow's on.schedule.cron line. Two things GitHub adds on top that this tool cannot show, because they are scheduler behaviour rather than part of the expression itself: a scheduled workflow run can be delayed up to several minutes past its exact trigger time under high GitHub Actions load, and a schedule on a repository with no activity for 60 days is automatically disabled until someone pushes a commit.

Related tools

From the intelligence desk