esc

Cron Expression Generator

Build a 5-field cron schedule visually, explain cron syntax in plain English and preview next run times in your browser.

Cron expression
Minute 0–59
Hour 0–23
Day (Month) 1–31
Month 1–12
Day (Week) 0–6
Every minute.
Common schedules
Visual builder
Two-way
Next scheduled runs
Local time
Field reference
Field Allowed values Names Position
Minute 0–59 — 1st
Hour 0–23 — 2nd
Day of month 1–31 — 3rd
Month 1–12 JAN–DEC 4th
Day of week 0–7 (0 and 7 = Sunday) SUN–SAT 5th
* any value , value list (1,15,30) - range (1-5) / step (*/15, 20/15)
Guide

How cron expressions work

A cron expression is five space-separated fields that tell a scheduler when to run a job: minute, hour, day of month, month and day of week . A job fires whenever the current time matches all five fields. Each field accepts a single value, a list ( 1,15,30 ), a range (1-5), a step (*/15) or * for “any”.

Use this cron expression generator to build common schedules, explain cron expressions in plain English, and preview next scheduled runs before adding a job to crontab, Kubernetes, GitHub Actions or another 5-field scheduler.

One classic gotcha: when both day-of-month and day-of-week are restricted, most cron implementations treat them as OR — the job runs when either matches, not both. This tool follows that rule when computing the next runs. Cron compatibility still varies between schedulers, especially for seconds fields, year fields and advanced tokens, so confirm production syntax in your target scheduler. Everything is calculated entirely in your browser using your device clock — nothing you build is uploaded.

Examples

Cron expression examples

Type each part into its own field box, or start from a preset and edit. The middle column is the plain-English description the tool shows for that expression.

Expression Tool description What to know
*/15 * * * * Every 15 minutes. Runs at :00, :15, :30 and :45 of every hour.
0 */6 * * * Every 6 hours. 00:00, 06:00, 12:00 and 18:00 — aligned to the clock, not to when the job was added.
0 9 * * 1-5 At 09:00, on Monday through Friday. The classic weekday report. 0 9 * * MON-FRI is equivalent.
30 2 1 * * At 02:30, on the 1st of the month. Monthly maintenance; check daylight-saving rules if 02:30 can be skipped locally.
*/15 9-17 * * 1-5 At minute 0, 15, 30 and 45 past hour 9, 10, 11, 12, 13, 14, 15, 16 and 17, on Monday through Friday. The last run is 17:45, not 17:00, because hour 17 is included.
0 18 * * 5-7 At 18:00, on Friday through Sunday. Both 0 and 7 mean Sunday, so 5-7 runs at 18:00 on Friday, Saturday and Sunday.
0 0 1 JAN * At 00:00, on the 1st of the month, in January. Once a year at midnight on 1 January. Months are numbered 1–12, so 0 0 1 1 * is the same schedule.
20/15 * * * * Every 15 minutes from minute 20 through 59. Runs at :20, :35 and :50. Classic crontab rejects a step after a single number; write 20-59/15 there.
0 0 1,15 * 5 At 00:00, on the 1st and 15th of the month, on Friday. Runs on the 1st, the 15th and every Friday — both day fields are set, so they combine with OR.
Reading results

How to read the description and next runs

  • Field boxes — minute, hour, day of month, month and day of week. A box with an invalid value turns red and the readout explains the problem, for example "60" is out of range (0–59) for minute.
  • Description — a plain-English reading of the whole expression, followed by the expression itself and the field order.
  • Next scheduled runs — the next six matching times in your browser's local time zone, with the zone abbreviation and a relative time such as "in 2 days, 3 hours". If the list says no upcoming runs were found, the expression can never match, for example 0 0 30 2 * (30 February).
  • Visual builder — choose Minute, Hour, Day, Week, Month or Year and fill in the sentence. Editing the fields directly updates the builder on a best-effort basis; complex expressions are easier to edit by hand.
Platforms

Using the expression in crontab, Kubernetes and GitHub Actions

The five fields mean the same thing on these platforms, but the time zone and the surrounding syntax do not.

Linux crontab

# crontab -e  (per-user crontab)
0 9 * * 1-5 /usr/local/bin/daily-report.sh

Jobs run in the system's time zone unless your cron implementation supports something like CRON_TZ (cronie does; check man 5 crontab). In /etc/crontab and /etc/cron.d/* a user name goes between the schedule and the command. A % in the command is treated as a newline unless escaped as \%, and cron runs with a minimal environment, so use absolute paths.

Kubernetes CronJob

spec:
  schedule: "0 9 * * 1-5"
  timeZone: "Etc/UTC"

Without .spec.timeZone, the schedule is interpreted in the time zone of the kube-controller-manager. Put CRON_TZ or TZ in the schedule string and Kubernetes rejects the resource with a validation error — use the timeZone field instead.

GitHub Actions

on:
  schedule:
    - cron: "30 5 * * 1-5"

Scheduled workflows run in UTC by default; GitHub also accepts an optional timezone key with an IANA zone name next to cron . The shortest interval is every 5 minutes, runs can be delayed when load is high (the start of every hour is busiest), schedules only run from the default branch, and @daily -style shortcuts are not supported. In public repositories, scheduled workflows are disabled automatically after 60 days without repository activity.

Troubleshooting

Cron troubleshooting

The job runs at the wrong hour

The preview uses your local time zone, but the scheduler uses its own — often UTC. Convert the intended local time to the scheduler's zone, for example with the Unix Timestamp Converter 's time-zone panel, or set an explicit zone where the platform allows it.

It runs on more days than expected

If both day of month and day of week are restricted, a day matches when either field matches. To run only on Fridays that fall on the 1st–7th, leave one field as * and add the other check in your script.

Uneven gaps with steps

Steps restart at the beginning of each range. */7 in minutes runs at :49 and :56 and then again at :00, only four minutes later; 0 0 */2 * * runs on odd days of the month, so it fires on the 31st and again on the 1st. Cron cannot express "every 48 hours" exactly.

A field is rejected

  • Each box holds one field. Pasting a whole expression such as 0 9 * * 1-5 into the Minute box is reported as invalid; use the presets or fill the boxes one by one.
  • Shortcuts such as @daily and Quartz-style tokens L, W, # and ? are not accepted. Write the five-field equivalent: @daily is 0 0 * * *.
  • In day of week, this tool follows Vixie cron and cronie: both 0 and 7 mean Sunday, so 0-7 is every day and 5-7 is Friday through Sunday. Kubernetes CronJobs accept only 0–6, so use 0 or SUN for Sunday there.
  • A step after a single number, such as 20/15 , means “from 20 to the end of the field” (minutes 20, 35 and 50), as in Kubernetes and GitHub Actions. Vixie cron and cronie reject this form in crontab; write 20-59/15 to get the same result everywhere.
Limitations

What this cron tool does not cover

  • Five fields only. There is no seconds field (used by Quartz and Spring) and no year field (used by Quartz and AWS EventBridge), so expressions for those schedulers need adapting.
  • No time-zone selector. Next runs are always shown in your browser's time zone. Around daylight-saving changes, schedulers differ in how they treat a skipped or repeated hour, so be careful with jobs between 01:00 and 03:00 local time, or schedule in UTC.
  • Day-field rule. The tool applies the OR rule whenever both day fields are something other than a bare *. Some implementations, such as Vixie cron and cronie, also treat a field that starts with * (for example */2) as unrestricted, so a combination like 0 0 1 * */2 can run on fewer days there than the preview shows.
  • It does not run or monitor jobs. The tool only builds and explains expressions; it cannot check your command, environment or whether a job actually ran.

Related: convert run times and epoch values with the Unix Timestamp Converter, and check scheduled-job payloads with the JSON Formatter.

FAQ

Frequently asked questions

Is this standard 5-field cron or Quartz cron?

This tool generates standard 5-field Unix/Vixie cron expressions used by crontab, many Linux schedulers, Kubernetes CronJobs, and GitHub Actions. It does not generate Quartz seconds or year fields.

What time zone are the next runs in?

The preview uses your browser local time zone. Real cron jobs run in the scheduler or server time zone, often UTC, so confirm the runtime environment before deploying.

Does Sunday count as 0 or 7?

Both. In Vixie cron and cronie, 0 and 7 both mean Sunday, so 0-7 means every day and 5-7 means Friday through Sunday. This tool follows that rule and also accepts the names SUN-SAT. Some schedulers, such as Kubernetes CronJobs, accept only 0-6, so use 0 or SUN when you need portability.

Can cron syntax differ between schedulers?

Yes. Cron compatibility varies across Unix crontab, Kubernetes, GitHub Actions, Quartz, cloud schedulers, and application libraries. Check your scheduler documentation before using advanced syntax in production.

Is anything sent to a server?

No. Parsing, plain-English descriptions and next-run calculations happen client-side in your browser.