elefcode

Cron Expression Generator

Build or paste a cron schedule, read it in plain English, see when it runs in any time zone, and convert it for crontab, GitHub Actions, Kubernetes, AWS, Quartz, Spring or systemd.

Minute
0
Hour
9
Day of month
*
Month
*
Day of week
1

At 09:00, on Monday.

Minute0
Hour9
Day of month*
Month*
Day of week1

Presets

Use it in

0 9 * * 1 /usr/local/bin/backup.sh

Advertisement

Guide

About the Cron Expression Generator

A cron expression is five fields — minute, hour, day of month, month and day of week — that together describe when a job runs. */15 9-17 * * 1-5 means every 15 minutes during working hours on weekdays. The syntax is compact, which also makes it easy to get subtly wrong.

Type or paste an expression (or build one field by field) and the tool explains it in plain English, lists when it will actually run, and gives you the equivalent for the scheduler you are using — because AWS, Quartz and systemd each speak a slightly different dialect.

The five fields and their special characters

  • * — every value. 5 — exactly 5. 1,15 — a list.
  • 9-17 — a range. */15 — every 15th value; 5/15 — every 15th starting at 5.
  • Months and weekdays accept names: JAN, MON-FRI. Sunday is 0 (or 7).
  • L — the last day of the month; 5L — the last Friday. 1#2 — the second Monday.
  • Macros: @hourly, @daily, @weekly, @monthly, @yearly.

The day-of-month “or” trap

When both day fields are restricted, standard cron runs when either matches. 0 9 1 * 1 does not mean “the 1st, if it is a Monday” — it means every Monday and the 1st of every month. To run on the first Monday, use 0 9 * * 1#1. The tool flags this whenever both fields are set.

Time zones

Cron runs in the time zone of whatever executes it. Linux servers and containers are usually UTC, GitHub Actions is always UTC, and Kubernetes uses the controller’s zone unless you set timeZone on the CronJob. Pick the zone that matches your scheduler to see the real run times — and remember that around daylight-saving changes, a job at 02:30 local time can run twice or not at all.

Dialects: AWS, Quartz, Spring and systemd

AWS EventBridge adds a year field and requires ? in one of the day fields. Quartz adds a seconds field at the front and counts Sunday as 1, not 0 — so a weekday number copied straight from crontab silently shifts the job by a day. The converter writes weekday names wherever it can to avoid that, and reads AWS and Quartz expressions back in. systemd timers use a different calendar syntax altogether (OnCalendar=Mon..Fri *-*-* 09:00:00).

How to use it

  1. 1Type or paste an expression, choose a preset, or build it field by field.
  2. 2Read the plain-English description and check the warnings.
  3. 3Pick your scheduler’s time zone and look over the next runs.
  4. 4Choose where you will use it — crontab, GitHub Actions, Kubernetes, AWS, Quartz, Spring or systemd — and copy.

Frequently asked questions

What does */5 mean in cron?

Every fifth value of that field, starting from its lowest value. In the minute field, */5 runs at :00, :05, :10 and so on. Use 2/5 to start at :02 instead.

How do I run a job on weekdays only?

Put 1-5 (or MON-FRI) in the last field: 0 9 * * 1-5 runs at 09:00 Monday to Friday.

How do I run on the last day of the month?

Use L in the day-of-month field: 0 0 L * *. Standard Vixie cron does not support L, but most modern schedulers (Quartz, Spring, AWS, cron-parser based tools) do; on a plain Linux crontab, run daily and check the date in your script.

Why is my Quartz or AWS job running on the wrong day?

Both count Sunday as 1, while crontab counts Sunday as 0. A crontab expression copied across with a weekday number runs one day early. Convert it here, or use day names such as MON.

Does GitHub Actions use my time zone?

No. Scheduled workflows always run in UTC, and runs more frequent than every five minutes are not supported. Select UTC above to see the real times.

Can I use seconds?

Yes — six fields with seconds first, as Quartz and Spring expect. Standard crontab, GitHub Actions and Kubernetes have no seconds field, so the converter drops it for those.

Learn more

Related tools