Cron expressions, explained
Paste a cron expression to read it in plain English and see exactly when it will run, in any time zone, with daylight-saving changes handled the way cron handles them. Then convert it for Quartz, AWS EventBridge, Kubernetes, GitHub Actions, systemd, Windows or your calendar — every conversion is checked against the original run by run.
Runs
Try one
Explain / Test
- Cron expression parserPlain-English meaning, a field-by-field breakdown and the next runs.
- Next run calculatorNext or previous runs in any time zone, or every run between two dates.
- Cron validatorCheck one expression against 13 cron dialects at once.
- Schedule visualizerWeek heatmap and month calendar of when a job fires.
- Cron diffCompare two schedules run by run and see what only one of them does.
- Overlap checkerFind the minutes where several jobs start at the same time.
- Crontab checkerLint a whole crontab: unescaped %, PATH, DST hours, missing newline.
- Crontab viewerA crontab as a table of meanings and next runs, exportable.
Build / Generate
- Cron generatorClick an expression together and watch it explained as you go.
- Text to cronType "every weekday at 9:30" and get 30 9 * * 1-5.
- Crontab line builderSchedule, command, lock file and logging, with % escaped for you.
- Stagger generatorSpread many jobs across a window so they never start together.
- Cron to codeOne schedule as node-cron, Celery, Spring, Laravel, Go and more.
Platforms
- AWS cron & rateEventBridge cron() and rate(): build, validate, next runs.
- GitHub Actions scheduleLocal time to UTC cron, DST-proof workflow YAML, the 5-minute floor.
- Kubernetes CronJobCronJob YAML with timeZone, concurrencyPolicy and history limits.
- Jenkins H calculatorWhat H resolves to for your job name, and when the job will run.
- Spring @Scheduled cronSix-field Spring expressions checked, explained and converted.
- Azure Functions timerNCRONTAB six-field schedules and the function.json to go with them.
- Celery crontab()celery beat crontab() arguments from a cron line, and back.
Convert
- Cron to QuartzUnix cron to Quartz with the seconds field, "?" and day numbers fixed.
- Quartz to cronQuartz to Unix cron, with workarounds for L, W and #.
- Time zone converterRewrite a schedule for another time zone, DST included.
- Cron to systemd timerOnCalendar= plus ready-to-use .timer and .service units.
- OnCalendar testersystemd calendar expressions normalised, with the next elapse.
- Cron to iCal RRULEAn RFC 5545 RRULE and a calendar file of upcoming runs.
- Cron to launchdA macOS StartCalendarInterval plist from a cron line.
- Cron to Task Schedulerschtasks and PowerShell triggers for Windows.
Reference
- Cron cheat sheetSyntax, special characters and dialect differences on one page.
- Cron examplesReady-made schedules in Unix, Quartz, AWS and Spring form.
Common schedules
How to read a cron expression
- Split it on spaces. Standard cron has five fields: minute, hour, day of month, month, day of week — then the command.
- Read each field:
*is every value,5one value,1-5a range,1,15a list and*/15every 15th value. - Combine them: the job runs at every minute where all the time fields match and the day fields match.
- Watch the day fields. If both day of month and day of week are restricted, Linux cron runs on either — the parser above tells you when that applies.
One syntax, thirteen dialects
"Cron" is a family, not a standard. Linux cron has five fields and numbers Sunday as 0 or 7. Quartz and Spring add a seconds field;
Quartz and AWS EventBridge number Sunday as 1 and insist on a ? in one day field. Jenkins adds H to spread jobs
across the hour. Kubernetes uses Go's robfig/cron parser, which reads */2 in the day-of-month field differently from Linux.
GitHub Actions runs in UTC unless the workflow sets a timezone:, and never more often than every five minutes.
The validator checks one expression against all of them at once, and the
cheat sheet lists the differences side by side.
FAQ
What does */5 * * * * mean?
Every five minutes: at minute 0, 5, 10 … 55 of every hour, every day. The */5 is a step over the whole minute range.
How do I run a cron job every day at a specific time?
Put the minute and hour in the first two fields and leave the rest as *: 30 6 * * * runs at 06:30 every day,
in the time zone of the machine running cron.
Why did my cron job not run?
The usual causes are a schedule that means something other than intended (check it above), a time zone that differs from what you
assumed, an unescaped % in the command (cron turns it into a newline), or a crontab file whose last line has no newline.
The crontab checker finds all four.
Is my expression sent anywhere?
No. Every tool on cronkit.org runs in this page. Expressions you share are kept after the # in the link, which browsers do not send to servers.