Encode & hash

Cron Expression Generator

Paste a cron expression and get plain English plus the next six real run times in the timezone you choose.

Private by design — your data never leaves your device.
✓ Free forever✓ No sign-up✓ No ads✓ Works offline once loaded

Cron Expression Generator

Paste a cron expression and get plain English plus the next six real run times in the timezone you choose.

Input

Cron expression

Nothing is uploaded.

Output

Explanation and next runs

Your result appears herePaste on the left and select “Explain expression”

The situation that brings people here is nearly always the same: you have inherited an expression like 0 3 * * 1-5 from a crontab, a Kubernetes CronJob manifest, a GitHub Actions schedule or a Quartz configuration, and you need to know what it actually does before you touch it. Five asterisks and a couple of numbers are not self-documenting, and getting it wrong means a job that silently never fires or one that fires far more often than anyone intended.

Be clear about what this page is, because plenty of tools called "cron generator" are something else. This is a parser and explainer, not a form-based builder. You give it an expression; it gives you a sentence describing the schedule, a labelled breakdown of every field, and — the part that actually settles arguments — the next six concrete run times computed in an IANA timezone of your choosing, defaulting to UTC. Reading "at 03:00 on weekdays" is reassuring; seeing six real timestamps is proof.

How it works

How to use the cron expressions

  1. 1

    Paste the expression, or the whole crontab line

    You do not need to isolate the schedule. Paste the full line including its command — 0 3 * * 1-5 /usr/local/bin/backup.sh --full — and the trailing command is separated out and reported back rather than confusing the parser. A leading # comment line is skipped, so copying two lines out of a crontab works fine.

  2. 2

    Pick the timezone the job runs in

    Run times default to UTC. Change it to the IANA zone your scheduler actually uses — America/New_York, Europe/London, Asia/Kolkata — and the six upcoming timestamps are recalculated. This is the setting that catches daylight-saving surprises.

  3. 3

    Check the field breakdown against the next runs

    The output pairs a plain-English description with a per-field table and the six upcoming executions. If the sentence sounds right but the timestamps do not, the timestamps are correct and your mental model of the expression is not — that gap is exactly what this tool exists to expose.

Five fields, six fields, seven fields and the @shorthands

Classic Unix cron takes five fields, in this order:

  • minute (0–59), hour (0–23), day of month (1–31), month (1–12), day of week (0–6, Sunday is 0)

Quartz, Spring and several other schedulers prepend a seconds field, giving six, and some append a year field, giving seven. All three shapes are accepted here. When six or seven fields are supplied and the sixth looks like a schedule field rather than a command, it is read as part of the expression; otherwise everything past field five is treated as the command. Fewer than five fields or more than seven is rejected with an explanation rather than a guess.

The shorthand aliases are expanded before parsing, and the expansion is reported so you can see what you actually asked for:

  • @hourly0 * * * *
  • @daily and @midnight0 0 * * *
  • @weekly0 0 * * 0 (midnight on Sunday)
  • @monthly0 0 1 * * (midnight on the 1st)
  • @yearly and @annually0 0 1 1 * (midnight on 1 January)

@reboot is deliberately not supported, and that is not an oversight. It is not a schedule at all — it tells cron to run the command once when the daemon starts. There is no recurrence to describe and no next run time to compute, because the answer depends on when the machine next boots.

Within a field you can use a single value (5), a list (1,15,30), a range (9-17), a step (*/15, meaning every fifteenth unit), or a step over a range (9-17/2). Month and day-of-week also accept three-letter names such as JAN and MON.

The day-of-month / day-of-week trap

This is the one behaviour that surprises experienced engineers, and it is worth reading twice. Cron fields are normally ANDed together: 30 4 * * * means minute 30 and hour 4. But day-of-month and day-of-week are ORed when both are restricted to something other than *.

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 on every Friday — roughly five times as many runs as intended. The correct reading of a Friday-the-13th schedule cannot be expressed in standard cron at all; you have to restrict one field and test the other inside the job itself.

The rule in full: if either day field is *, the other one simply applies. If both are restricted, the job runs when either matches. This behaviour is specified in POSIX and implemented by Vixie cron, so it is not a quirk of one distribution. Quartz sidesteps it by requiring ? in whichever day field you are not using.

The six upcoming run times are the reliable way to catch this. If you expected a schedule to fire monthly and the list shows entries a few days apart, you have hit the OR rule.

Timezones, daylight saving and where the expression runs

A cron expression carries no timezone information. It is interpreted by whatever is executing it, which might be the server's local zone, the CRON_TZ or TZ variable set at the top of the crontab, the timeZone field of a Kubernetes CronJob, or UTC. GitHub Actions and most managed schedulers use UTC unconditionally. Choosing the wrong zone here produces six perfectly computed timestamps that describe a schedule nobody is running.

Daylight-saving transitions are where this becomes concrete. In a zone that observes DST, a job scheduled at 0 2 * * * will be skipped on the spring-forward day, because 02:00 never occurs, and may run twice on the autumn day when 02:00 happens twice. If a job must run exactly once a day, schedule it outside the 01:00–03:00 window or run it in UTC.

Run times are shown as YYYY-MM-DD HH:MM:SS in the zone you selected, so they are directly comparable with what your scheduler will log.

Common questions

Cron Expressions FAQ

Does this create or run cron jobs?

No. It parses and explains an expression and shows when it would next fire. It has no connection to any scheduler, does not install anything into a crontab, and cannot execute a command. Everything happens in your browser.

Why is it called a generator if it does not build expressions from a form?

Because that is what people search for. What the page honestly does is take an expression and generate its explanation, field breakdown and next run times. Writing cron by hand and checking the timestamps is faster than clicking through a form, and it is the only approach that tells you what an inherited expression really does.

Why does my job run more often than the expression suggests?

Almost certainly the day-of-month / day-of-week OR rule. When both of those fields are restricted, cron fires when either matches rather than when both do. Set one of them to * and test the other condition inside your script.

Is @reboot supported?

No, and it cannot be. @reboot is not a recurring schedule — it runs once when the cron daemon starts. There is no next run time to calculate, since it depends on when the machine is next restarted.

Can I paste a Quartz expression with seconds?

Yes. Six-field expressions with a leading seconds field, and seven-field expressions with a trailing year, are both accepted, and the field breakdown labels them accordingly. Quartz-specific tokens such as L, W and # are not part of standard cron and may not be interpreted the way Quartz would.