How to Use This Tool
Type a cron expression. You get each field in plain English, the next ten times it will actually fire, and a warning if it can never fire at all.
The rule that catches everyone
A cron line has five fields: minute hour day-of-month month day-of-week. Four of them
combine the way you would expect — all conditions must hold. The two day fields do not.
If both the day-of-month and day-of-week fields are restricted — that is, neither is
* — the job runs when either matches. This is the documented
behaviour of POSIX cron and of Vixie cron, which is what almost every Linux system runs.
So 0 0 13 * 5 does not mean “midnight on Friday the 13th”. It means
“midnight on the 13th of every month, and also midnight every Friday”. Counted
over twenty years that is 5.2 runs a month, against the 1.75 Friday-the-13ths a year
the author meant — the job fires about 36 times more often than intended. The
expression is valid, the intention is obvious, and nothing warns you.
If either day field is * the rule does not apply and everything behaves normally. That
is why the problem stays hidden: the common expressions are all fine, and only the ones people write
deliberately go wrong.
Schedules that can never fire
0 0 31 2 * is perfectly valid cron. February has never had a 31st and never will, so the
job will never run. Same for 0 0 30 2 *. A checker that only reports “valid”
has answered the wrong question — this one searches forward and tells you when it finds nothing.
Two things this does not model
- Time zones and DST. Cron runs in the server's local time. When the clock jumps forward, a job scheduled inside the skipped hour may not run at all; when it goes back, it may run twice. The preview here uses your browser's clock and does not simulate that — if your job runs between 01:00 and 03:00, check what your specific cron implementation does.
- Non-standard extensions.
L,W,#and seconds-resolution fields belong to Quartz and to some language libraries, not to system cron. They are rejected here rather than guessed at, because guessing which dialect you meant is how a scheduler ends up firing at the wrong time.
