Cron Generator

Write a cron expression from a frequency, or paste one and see exactly when it will fire.

Runs on your deviceDeveloperWorkingNo account needed

What this tool does

Cron Generator works in both directions. Set "Start from" to the builder and pick a frequency — every minute, every N minutes, hourly, daily, weekly, monthly or yearly — and it writes the expression for you. Leave it on the paste option and it reads whatever crontab line you give it, restates the schedule as a sentence, and lists the next runs so you can check the sentence against real dates rather than trusting it.

The parser is the useful half. It reads the standard five fields — minute, hour, day-of-month, month, day-of-week — with numbers, ranges, comma lists, steps, and the three-letter names for months and weekdays, so 9-17 and mon-fri both work. The @hourly, @daily, @midnight, @weekly, @monthly and @yearly macros are expanded before parsing. Anything it cannot read produces a specific complaint rather than a shrug: which field, what it found, and why that value is out of range. Two rules catch people out and both are handled the way a real daemon handles them — day-of-week 7 means Sunday, and when day-of-month and day-of-week are both restricted the job runs on either match, not only when the two coincide.

Two limits are worth knowing before you rely on the preview. The run times are computed in this browser's time zone and there is no zone selector, while the machine actually running your job is very often set to UTC — the output says so under the table, and an offset you forget is the classic reason a nightly task lands an hour or five out. And this is a browser tool: the expression is parsed and the dates are calculated in this tab, nothing is transmitted, but nothing is installed either. It writes and explains the line; putting it into a crontab, a systemd timer or a CI schedule is still your job.

How to use it

  1. Choose where to start. "An expression I paste" explains what is in the input box. "The builder below" ignores the box and writes the expression from the frequency controls.
  2. Paste the line, or set the frequency. Load sample fills in */15 9-17 * * mon-fri. In builder mode, pick the frequency and then the weekday, day of the month or month it reveals. "At hour" and "At minute" stay on screen for every frequency, but only the fields the chosen frequency uses reach the expression: "Every minute" and "Every N minutes" ignore both, and "Every hour" ignores the hour.
  3. Set how many runs to preview. Show next takes 1 to 25. Five is enough to confirm a daily job; twenty-five is better for a weekly or monthly one, where the pattern takes longer to show itself.
  4. Read the sentence, then the dates. The description is generated from the parsed fields, and the table lists each run in local time, in UTC, and as a relative interval. If the two disagree with what you meant, the expression is wrong.

Processing & privacy

Runs on your device. Your file is processed directly in this browser.

Common use cases

Scheduling a nightly backup

Build it from the frequency controls, then read the next five dates to confirm it lands in the quiet hours on the server's clock and not on yours.

Reading a crontab you inherited

Paste each line and get a sentence. A cron parser is faster than counting asterisks, and it catches the field everyone miscounts — day-of-month against day-of-week.

Working out why a job never fired

An expression can be perfectly valid and still never match a real date. 0 0 30 2 * parses cleanly and is reported as never running, because 30 February does not exist.

Staggering jobs off the hour

Half a dozen tasks all set to minute 0 fight for the same load spike. Preview a few candidate expressions and pick minutes that do not collide.

Questions

Is my expression sent anywhere?
No. Parsing and the date arithmetic both happen in this browser tab, so nothing is transmitted or stored and the tool keeps working with the network off. Crontab lines tend to sit next to internal hostnames and deploy paths, which is reason enough to keep them local.
Does it support six-field cron with seconds?
No. It reads standard five-field cron only. A six or seven field expression — the Quartz and Spring style with a leading seconds field and an optional year — is rejected with a message telling you which extra fields to drop. The Quartz L, W and # extensions are refused for the same reason.
Why are the run times not in my server's time zone?
Because they are computed in this browser's time zone, which is the only one available without asking you to pick. The note under the table says as much. If your server runs on UTC, read the UTC column and set the expression from that. Around a daylight-saving change the preview follows this browser's clock, while daemons apply their own rules to the hour that is skipped or repeated.
What does an expression with both a day-of-month and a weekday do?
It runs on either. 0 0 13 * 5 fires on the 13th of every month and on every Friday, not only on Friday the 13th. This tool follows that rule, so the preview will show both sets of dates. Restrict one field and leave the other as * when you want a single condition.
Does @reboot work?
No, and it is refused with an explanation rather than a parse error. @reboot has no schedule at all — it runs once when the machine starts — so there are no future dates to list. The other macros are expanded and explained normally.
Does "every 15 minutes" stay evenly spaced?
Only when the interval divides 60. The builder writes */N * * * *, and cron restarts the count at the top of each hour, so */15 is even but */7 runs at 0, 7 … 56 and then leaves a four-minute gap before the next hour begins. The run table makes that visible.
Can it schedule the job for me?
No. It produces and explains the expression; installing it is separate. Paste the line into your crontab, a systemd timer, a CI schedule or your hosting panel, and remember that a crontab entry also needs the command and usually an absolute path.

Related tools