Cron Expression Builder

Build or paste a cron schedule and see what it means in plain English, with the next run times in UK time or UTC. Catches mistakes before they reach your server. Runs in your browser.

Try an example:

Private by design: the schedule is worked out on your device using standard (Vixie/POSIX) cron rules. Nothing is uploaded or stored.

How to use the Cron Expression Builder

  1. Type or paste a cron expression into the main box, such as 30 9 * * 1-5. Or pick one from Common schedules and adjust it.
  2. Edit any of the five small boxes (minute, hour, day, month, weekday) to build the schedule a field at a time. The main expression updates as you type.
  3. Read the plain-English description to check the schedule means what you think it does.
  4. Check the next 10 run times. Choose UK time, UTC or your device’s time zone to see them the way your server will.
  5. Read Good to know for traps such as the day-of-month and weekday rule, months without a 31st, and clock changes.
  6. Press Copy expression and paste it into your crontab, CI pipeline or hosting control panel.

If you enjoy what we do, consider supporting us. Every little bit means the world! Support Catpool on Ko-fi

The five fields

A standard cron expression has five fields separated by spaces, in this order:

  • Minute (0-59)
  • Hour (0-23, using the 24-hour clock)
  • Day of the month (1-31)
  • Month (1-12, or JAN-DEC)
  • Day of the week (0-6 with 0 as Sunday, or SUN-SAT; 7 also means Sunday)

Each field accepts * for “every”, a single value like 5, a list like 1,15, a range like 9-17, and a step like */10 (every 10th) or 9-17/2 (every second hour from 9 to 17). Shortcuts such as @daily, @hourly, @weekly, @monthly and @yearly are also understood and expanded for you.

Common mistakes this catches

  • The day-of-month OR weekday rule. If you set both, cron runs when either matches. 0 9 25-31 * 5 doesn’t mean “the last Friday of the month”. It means every day from the 25th to the 31st and every Friday. The tool spells this out and shows you the real run times.
  • Days that don’t exist. 0 0 31 * * skips every month with fewer than 31 days, and 0 0 30 2 * never runs at all.
  • Wrong field order. Writing the hour first (9 30 * * *) is a classic slip. The description makes it obvious, and 30 isn’t a valid hour.
  • Six-field expressions. Quartz, Spring and some cloud schedulers add a seconds field or a year, and use symbols such as ?, L, W and #. Standard cron (Linux crontab, GitHub Actions, Kubernetes CronJobs and most hosting panels) doesn’t, and the tool tells you when it spots them.
  • Every minute by accident. * 9 * * * runs 60 times between 09:00 and 09:59, not once at 09:00. That’s rarely what you want.

Time zones and the clocks changing

Cron uses the server’s time zone, which is often UTC rather than UK time. In summer, a job set for 09:00 UTC runs at 10:00 in the UK. Use the time-zone switch to see both. When the UK clocks go forward in March, the hour from 01:00 to 01:59 doesn’t exist, and when they go back in October it happens twice. Jobs scheduled in that hour can be skipped or run twice depending on your cron. The run-time list follows the real UK clock changes, and many teams simply run servers on UTC to avoid the problem.

Privacy

Everything runs in your browser. The expression isn’t uploaded or stored, and run times are worked out with your browser’s built-in time-zone data. No account, no tracking of what you schedule.

Frequently asked questions

Does this work for GitHub Actions and Kubernetes?

Yes. Both use standard five-field cron. GitHub Actions schedules always run in UTC, so choose UTC to see the true times. Note that GitHub can delay scheduled runs at busy times.

How do I run a job every 90 minutes?

Cron can’t do that in one line, because 90 doesn’t divide an hour evenly. Use two lines, 0 0-21/3 * * * and 30 1-22/3 * * *, or a scheduler that supports intervals.

What does */15 really mean?

It means every value in the field that’s a multiple of 15 from the start of the range: minutes 0, 15, 30 and 45. It doesn’t count from when the job was created.

Can I schedule the last day of the month?

Not in standard cron. Run on days 28-31 and have your script check whether tomorrow is the 1st.

Related: Catpool home, Developer, Unix Timestamp Converter, Regex Tester, JSON Formatter, UUID Generator.

Related tools