A cron expression tool that knows GitHub Actions isn't AWS (unlike me at 2am)
Cron looks universal until you paste the same expression into GitHub Actions, Kubernetes, AWS EventBridge, Vercel and Quartz and get five different behaviours. My free cron tool explains any expression in plain English, builds one from a sentence like 'every weekday at 9:30', shows the next runs in your time zone and UTC, flags daylight-saving traps and checks the expression against each platform's actual rules.

Cron is a tiny language with five fields, and I have still managed to get it wrong in every way available. Scheduled a GitHub Action for 9am and watched it run at 2:30pm (UTC, hello). Copied a crontab line into AWS EventBridge and had it rejected because of a question mark I'd never heard of. Set a job to run on "the 1st and on Mondays" and learned it runs on the 1st or on Mondays.
So I built a cron expression explainer and generator that knows which platform you're on.
Why does the same cron expression behave differently?

Because "cron" is really six dialects in a trench coat.
| Platform | Fields | Day of week | Quirks worth knowing |
|---|---|---|---|
| Standard crontab | 5 | 0 to 6, Sunday = 0 | @daily style macros; day-of-month and day-of-week are OR'd |
| GitHub Actions | 5 | 0 to 6 | UTC unless you set timezone:, default branch only, 5-minute minimum, busy at minute 0 |
| Kubernetes CronJob | 5 | 0 to 6 | Time zone goes in spec.timeZone; CRON_TZ= in the schedule is rejected since 1.29 |
| AWS EventBridge | 6 (with year) | 1 to 7, Sunday = 1 | One day field must be ?; rules run in UTC |
| Vercel Cron | 5 | 0 to 6 | UTC, no month or day names, Hobby plans run once a day with up to 59 minutes of drift |
| Quartz (Java) | 6 or 7 (with seconds) | 1 to 7, Sunday = 1 | Seconds field, ?, L, W and # |
So the 1 that means Monday in your crontab means Sunday in EventBridge. Fun.
How do the popular cron tools compare?
| Tool | Good for | Watch out for | Honest assessment |
|---|---|---|---|
| crontab.guru | Reading a standard 5-field expression fast | Standard crontab only, no platform checks or time zones | The classic. Bookmarked forever. |
| CronMaker and Quartz generators | Building Quartz expressions | Quartz only | Useful if you're on Spring or Quartz. |
| Your cloud's console | Validating at deploy time | You find out when it's already wrong | The most expensive validator. |
| Sidd's cron tool | Multi-platform checks, sentence to cron, DST, conversion | It reads schedules; it doesn't run your jobs | crontab.guru's nosy cousin who read every platform's docs. |
How do I write a cron expression from plain English?
Type the schedule as a sentence. The tool turns it into cron with a small rule-based parser that runs in your browser (no AI, no server, no guessing at what you meant). It understands things like:
every 15 minutesevery hour at :17every weekday at 9:30every Monday and Thursday at 18:00on the 1st of every month at midnightfirst Monday of the month at 10amlast day of the month at 23:00
If you use a word it doesn't understand, it tells you which one and doesn't invent a schedule for it.
What does it check for each platform?
The Checks tab lints the expression against the platform you picked. These were written against each platform's official docs (checked October 2026). A few favourites:
- Never runs.
0 0 30 2 *(30 February) is valid syntax and will wait patiently forever. - Either day vs both days. With both day fields set, crontab runs when either matches. With a
*/2style day field, both have to match. The check explains which one you've got and how to get the other. - EventBridge day numbering. Flags when your day-of-week is probably off by one.
- Missing
?for EventBridge and Quartz. - GitHub Actions: runs in UTC unless you set
timezone:, only from the default branch, paused after 60 days of inactivity in public repos, and often delayed at minute 0. - Vercel Hobby limits: at most one run a day, and a run can start any time within the scheduled hour.
- Kubernetes
CRON_TZ=prefixes, which newer clusters reject, plus a reminder aboutstartingDeadlineSecondsandconcurrencyPolicy. - Not supported here: names,
@dailyshortcuts,L/W/#or?on platforms that don't accept them. - Too often for platforms with a minimum interval.
⚠ Top of the hour is busy
GitHub delays scheduled runs under load, and minute 0 is the busiest.
Fix: pick a minute like 17 if exact timing doesn't matter.
That one alone would have saved me a confused afternoon.
When will my cron job actually run?
The Runs tab shows the next runs in your time zone and in UTC, side by side, so you can see the 2:30pm surprise before it happens. Pick any IANA time zone for the schedule.
It also scans about a year ahead for daylight-saving traps: runs that land in an hour that's skipped when clocks go forward (the job might not run) or repeated when they go back (it might run twice). Those dates are marked.
flowchart LR
A[Paste cron or type a sentence] --> B[Plain-English explanation]
B --> C[Next runs: your zone + UTC]
C --> D[DST traps marked]
D --> E[Platform checks]
E --> F[Copy config snippet]Can I convert cron between platforms?
Yes. The Convert tab rewrites the expression for another platform: adds or drops the seconds and year fields, swaps * for ? where needed, renumbers days of the week (including ranges that wrap around Sunday) and expands bare steps like 5/10 into 5-59/10. Then it compares the next 50 runs of both versions and tells you whether they match, so you're not trusting the conversion blindly.
The Snippet tab gives you the config in the shape each platform expects: the on: schedule: block for a GitHub workflow, a CronJob spec for Kubernetes, the crons entry for vercel.json, and so on.
FAQ
How do I read a cron expression?
Paste it into the cron tool and pick your platform. It explains it in plain English and lists the next run times.
Why didn't my GitHub Actions schedule run on time?
Schedules run in UTC unless you set timezone:, they only run from the default branch, and jobs at the top of the hour are often delayed. The checks tab flags each of these for your expression.
Why is the day of week different in AWS EventBridge?
EventBridge and Quartz number days 1 to 7 starting at Sunday, so 2 is Monday. Crontab counts from 0 for Sunday, so 1 is Monday. The convert tab renumbers them for you.
What does the question mark mean in cron?
In EventBridge and Quartz, ? means "no specific value" and goes in whichever of day-of-month or day-of-week you aren't using. Standard crontab doesn't support it.
How do I run a cron job every weekday at 9am?
In crontab: 0 9 * * 1-5. Type "every weekday at 9am" into the tool and it'll write it for your platform, and on GitHub Actions it'll suggest a minute other than 0.
Does it handle daylight saving time?
Yes. Runs that fall in a skipped or repeated hour in the schedule's time zone are marked, up to about a year ahead.
Want to try it?
Open the cron expression tool, switch the platform to AWS EventBridge and paste your favourite crontab line. Then watch it complain. Everything runs in your browser, nothing is sent anywhere, and there are more free tools where this came from.
Hit a cron quirk the tool doesn't know about? Tell me at siddhant06137@gmail.com or on X as @creatorsidd. Need someone to untangle your team's scheduled jobs? Book a 15-minute call.