Skip to content
OpsKit

Cron Expression Parser

Paste a cron expression and see when it actually fires. Every field is broken down, and run times are shown in whichever timezone your scheduler is using — which is where most cron surprises come from.

Common schedules

Next run times

Field breakdown

FieldValueMatches
Minute00
Hour99
Day of month*every value
Month*every value
Day of week1-5Mon, Tue, Wed, Thu, Fri

Runs entirely in your browser. This page is a static file. Whatever you type stays in the tab, is never sent to a server, and is gone when you close it — so pasting a real token or config is safe.

When you reach for this

  • Writing a Kubernetes CronJob and needing to confirm it fires at 9am Seoul time, not 9am UTC.
  • Reviewing an inherited crontab where nobody remembers what 30 2 * * 0 means.
  • Checking that a batch job and the backup window will not collide next month.

Worked examples

Every weekday at 09:00

Input
0 9 * * 1-5
Result
Mon–Fri at 09:00

Day-of-week uses 0–6 with Sunday as 0. Both 0 and 7 mean Sunday.

Every 15 minutes during business hours

Input
*/15 9-18 * * 1-5
Result
09:00, 09:15 … 18:45, weekdays only

The step applies within the range, so this stops after 18:45 rather than running all night.

The one that surprises people

Input
0 0 1 * MON
Result
The 1st of every month AND every Monday

When both day fields are restricted, cron ORs them together instead of requiring both.

Where people get this wrong

Assuming the container runs in your timezone

A Kubernetes CronJob without a timeZone field uses the controller's zone, which is normally UTC. A 09:00 schedule then runs at 18:00 KST.

Reading `*/5` in the hour field as five hours

A step divides the whole range from 0, so */5 in the hour field means 0, 5, 10, 15, 20 — not every fifth hour from now.

Mixing day-of-month and day-of-week

Restricting both makes the schedule fire more often, not less. Leave one as * unless you genuinely want the union.

Frequently asked questions

How many fields should a cron expression have?

Standard Unix cron and Kubernetes CronJob use 5: minute, hour, day-of-month, month, day-of-week. AWS EventBridge adds a sixth year field and requires a ? in one of the two day fields. Quartz puts seconds first, making 6 or 7.

Why does my Kubernetes CronJob fire at the wrong hour?

Unless you set spec.timeZone, the schedule is interpreted in the kube-controller-manager's timezone — usually UTC. Set it explicitly, or write the schedule in UTC and document it.

What does @daily mean?

It is shorthand for 0 0 * * *, midnight every day. The other shortcuts are @hourly, @weekly, @monthly and @yearly. @reboot is different: it runs at startup and has no schedule.

Related tools