Cron Expression Generator

Build a cron expression by picking minutes, hours, weekdays and dates, then read it in English, see its next runs and get Quartz, EventBridge and GitHub forms.

The interactive tool loads here when JavaScript runs.

About this tool

What is the Cron Expression Generator?

Pick how often a job should run (every few minutes, hourly, daily, on chosen weekdays, on chosen dates each month or once a year), tick the hours and the minute, and the generator writes the five-field cron expression for you. Underneath it shows the schedule as an English sentence, so you can check it says what you meant, and lists the next eight run times in the time zone you choose, with daylight saving changes applied.

Schedulers do not all speak the same dialect, so the same schedule is also translated for Kubernetes CronJobs, GitHub Actions, Quartz and Spring, and AWS EventBridge. Each comes with notes on the rule that usually trips people up: GitHub runs in UTC and no more often than every five minutes, Quartz and EventBridge need a question mark in one of the day fields and count Sunday as 1, and Kubernetes only honours a time zone through spec.timeZone. If you already have an expression, switch to "Edit expression" to explain and translate it instead.

  • Visual builder for minutes, hours, weekdays, dates and months
  • Plain-English description with cronstrue
  • Next run times in any IANA time zone, DST aware (cron-parser)
  • Translations for Kubernetes, GitHub Actions, Quartz and AWS EventBridge
  • Warnings for impossible dates, skipped months and the day-of-month OR rule
  • Edit or paste an existing five-field expression
Read the guide: Cron Schedules Across Platforms: Crontab, GitHub, Kubernetes, AWS

How to use the Cron Expression Generator

  1. Choose a frequency, or click a preset such as "Weekdays at 09:00" or "Every 15 minutes".
  2. Pick the weekdays, days of the month or months that apply, then tick one or more hours and enter the minute past the hour.
  3. Choose the time zone to preview in; it defaults to your browser's zone.
  4. Read the English description and the next run times to confirm the schedule.
  5. Copy the expression, or the version for Kubernetes, GitHub Actions, Quartz or EventBridge, and read the notes for that platform.

Worked examples

Weekdays at 09:30

Input

Weekly, Mon to Fri, hour 09, minute 30

Output

30 9 * * 1-5; Quartz 0 30 9 ? * MON-FRI; EventBridge cron(30 9 ? * MON-FRI *)

Weekday names are used for Quartz and EventBridge so you do not have to shift the numbers by one.

Every 15 minutes

Input

Minutes, every 15

Output

*/15 * * * *

Runs at :00, :15, :30 and :45. On EventBridge it becomes cron(0/15 * * * ? *).

Twice a month

Input

Monthly, days 1 and 15, hour 06, minute 0

Output

0 6 1,15 * *

Useful for billing and report jobs. The preview confirms both dates.

The 31st

Input

Monthly, day 31

Output

0 0 31 * *, with a warning

Months without a 31st are skipped, not moved to the last day. The warning says so before the job silently misses five months a year.

Background and insight

The five-field format comes from Unix cron, standardised by POSIX and shaped by Paul Vixie's 1987 cron that most Linux distributions still descend from (cronie on Red Hat, Debian's cron). The fields are minute, hour, day of month, month and day of week; each takes *, a number, a list (1,15), a range (1-5) or a step (*/10). Day of week runs 0 to 6 from Sunday, and 7 is also accepted for Sunday. Steps written as 5/15 without a range are not accepted by classic Vixie cron, which is why this tool writes them as 5-59/15.

One rule surprises almost everyone. When both day of month and day of week are restricted, cron runs the job when either matches, not when both do. "0 9 1 * 1" runs on the first of every month and on every Monday. There is no five-field way to say "first Monday"; the usual workaround is to run every Monday with days 1-7 and test the date in the command, or use a scheduler with the # extension.

Time zones are the other trap. Classic cron uses the daemon's local time, so a 02:30 job can be skipped or run twice when clocks change. GitHub Actions evaluates schedules in UTC only. Kubernetes added the spec.timeZone field, stable since version 1.27. Quartz uses six or seven fields starting with seconds and requires "?" in either day of month or day of week; AWS EventBridge uses six fields ending with a year, the same "?" rule and 1 = Sunday. The next-run list here comes from the cron-parser library and the English text from cronstrue.

Common use cases

  • Writing a crontab entry

    Build the schedule for backups, log rotation, cache warmers or report emails without counting fields by hand.

  • CI and automation

    Get a GitHub Actions on.schedule value in UTC, with a reminder about delays and the five-minute minimum.

  • Cloud and Kubernetes jobs

    Translate a schedule for an EventBridge rule, a Kubernetes CronJob or a Spring @Scheduled method.

  • Reviewing someone else's schedule

    Paste an expression from a config file to see in English when it runs and the next dates.

Tips and limitations

  • Avoid scheduling at 00 minutes past the hour on shared systems; an odd minute such as 17 spreads load and dodges GitHub's busiest time.
  • Do not schedule daily jobs between 01:00 and 03:00 local time if your server observes daylight saving; use UTC or a different hour.
  • Cron sends output by email to the crontab owner if mail is configured; redirect output to a log file instead.
  • Commands run with a minimal environment and PATH. Use absolute paths in the command.
  • Use a lock (flock) if a run might take longer than the interval, so two copies never overlap.

Frequently asked questions

What is the cron expression for every weekday at 9 AM?

0 9 * * 1-5. Minute 0, hour 9, any day of month, any month, Monday (1) to Friday (5). In Quartz it is 0 0 9 ? * MON-FRI and in AWS EventBridge cron(0 9 ? * MON-FRI *).

Why does my job run on more days than I expected?

If you set both a day of month and a day of week, standard cron runs when either one matches. "0 9 1 * 1" fires on the 1st and on every Monday. Leave one of the two fields as * to get the intersection you probably wanted.

What time zone does a GitHub Actions schedule use?

Always UTC. Convert your local time before writing the expression, and remember that the UTC offset changes with daylight saving. GitHub also runs scheduled workflows at most every five minutes and may delay them under load.

How do I convert a crontab expression to AWS EventBridge?

Add a year field at the end, put ? in whichever of day of month or day of week you are not using, and wrap it in cron(). Day of week counts 1 = Sunday, so use names such as MON-FRI to avoid off-by-one errors.

Can cron run a job on the last day of the month?

Not with five standard fields. Run it on days 28 to 31 and add a test in the command such as [ "$(date -d tomorrow +%d)" = "01" ], or use Quartz or EventBridge, which support L for the last day.

How do I set a time zone for a Kubernetes CronJob?

Set spec.timeZone to an IANA name such as "Europe/London". The field has been stable since Kubernetes 1.27. Without it, the schedule uses the time zone of the kube-controller-manager.

Is there an in-depth guide to the Cron Expression Generator?

Yes. “Cron Schedules Across Platforms: Crontab, GitHub, Kubernetes, AWS” covers the background, how it works, common pitfalls and worked examples. Read the full guide.

People also search for

  • cron expression for every weekday at 9am
  • cron every 15 minutes during business hours
  • cron first monday of the month workaround
  • convert crontab to aws eventbridge cron
  • github actions cron schedule in utc
  • kubernetes cronjob time zone setting
  • quartz cron question mark day of week
  • cron job run on the 1st and 15th of the month