What a cron schedule really means, and the next five times it fires.
These are wall-clock times. A cron schedule fires when the server clock reads the time, whatever the offset that day — the Philippines has not observed daylight saving since 1978, so it does not shift here.
What it's for
Find out in plain words when a scheduled job will run, from the short cron line a server or an app uses — and see the exact times it will run next.
Before you start
Have the schedule line to hand, such as 0 9 * * 1-5, copied from a crontab, a server's settings or an app's documentation.
Enter the schedule
Type or paste it into Cron expression. It has five parts separated by spaces, and the labels under the box say what each one is: minute, hour, day of month, month and day of week. A * means "every".
Or start from an example
Press Every 15 min, Weekday 9am or Monthly to load a common schedule and change it from there. The OR trap loads the schedule people most often misread.
Choose where to count from
Leave Count forward from empty to list the runs coming up from now. Pick a date and time in it to see the runs after that moment instead.
Explain
Press Explain. The meaning at the top also updates as you type, so you can change one part and watch the sentence change.
Reading the result
If it goes wrong
Cron has five fields: minute hour day-of-month month day-of-week. That part is easy. The hard part is how the two day fields combine.
When both day-of-month and day-of-week are restricted, cron fires when EITHER matches — not when both do. So 0 0 13 * 5 is not Friday the 13th. It is midnight on the 13th of every month and midnight every Friday: roughly sixty runs a year, not one or two.
Nothing in crontab warns you. The job you thought ran annually quietly runs sixty times.
The other trap is a day that does not exist. 0 0 31 * * fires seven times a year — cron skips the shorter months rather than moving the run to the 30th. For the last day of the month, schedule it daily and test the date inside the job.
No, and this is the most misread rule in cron. When BOTH the day-of-month and day-of-week fields are restricted, POSIX cron fires when EITHER matches — not when both do. That expression runs at midnight on the 13th of every month AND at midnight every Friday: roughly sixty runs a year rather than one or two. To require both conditions, restrict one field and test the other inside the job itself.
Because six fields means Quartz or Spring, which put SECONDS in front. Unix crontab takes five, starting at the minute. The two are not interchangeable: “0 0 12 * * ?” is noon in Quartz and nonsense in a crontab. Dropping the leading field to make it fit would produce a plausible, wrong schedule, so it is refused with the reason instead.
Nothing — cron skips it rather than moving the run to the 30th or the 1st. “0 0 31 * *” fires seven times a year, and “0 0 30 * *” never fires in February. If you want the last day of the month, schedule it daily and test the date inside the job.
Both, in every real cron. Day-of-week runs 0 to 7 with Sunday at each end, which is why “* * * * 0” and “* * * * 7” are the same schedule. This accepts either and folds 7 onto 0.
They are wall-clock times, which is how cron itself works: “0 3 * * *” means “when the server clock reads 03:00”, whatever the UTC offset is that day. So the list is correct for whatever zone your server is in. On a server that observes daylight saving, a time inside the skipped hour never runs and a time inside the repeated hour may run twice — that does not arise in the Philippines, which has not observed DST since 1978.
Those are Quartz extensions: L is “last”, W is “nearest weekday”, and # is “the nth of the month”. No Unix crontab understands them. Reading “5L” as plain 5 would give you a run list that is confidently wrong, so it is named and refused instead.
Important
Runs entirely in your browser; nothing is transmitted. Standard five-field Unix cron only — Quartz syntax (six fields, L, W, #) is named and refused rather than guessed at. Run times are wall-clock times, which is how cron itself works. Nothing you type here is sent to our servers — the calculation runs entirely in your browser.