Cron Expression Generator
Build cron expressions visually with a human-readable preview.
Last updated: August 2026
0 * * * *
At minute 0 of every hour
Was this tool helpful?
Reading a cron expression
Cron is the scheduler that has run background jobs on Unix systems for decades. A standard cron expression has five fields separated by spaces, in this order: minute, hour, day of month, month, and day of week. Each field accepts a number, a list, a range, or a step. The hard part is not writing the expression, it is reading it correctly a month later, which is exactly what a generator helps with.
* * * * *
| | | | |
| | | | +-- day of week (0-6, Sunday = 0)
| | | +----- month (1-12)
| | +-------- day of month (1-31)
| +----------- hour (0-23)
+-------------- minute (0-59)Steps, ranges, and the examples that matter
The step syntax is where most confusion lives. */5 in the minute field means every 5 minutes, not at minute 5. A single number means exactly that value. Here are expressions you will reach for often:
*/5 * * * * every 5 minutes
0 * * * * at the top of every hour
30 2 * * * every day at 02:30
0 9 * * 1-5 at 09:00 Monday through Friday
0 0 1 * * at midnight on the 1st of each monthOne real gotcha: when both day-of-month and day-of-week are set to something other than *, standard cron treats them as an OR, so the job runs when either matches. Keep one of them as a wildcard unless you truly mean that OR behavior.
Questions that come up
Which time zone does cron use? Classic system cron runs in the server local time zone, so a schedule can shift an hour across daylight saving changes. Many managed schedulers let you pin a time zone explicitly; if yours does, set it so 09:00 means 09:00 all year.
Why does my five-field expression fail in this tool?Some platforms add a seconds field at the front (six fields) or a year field at the end. Quartz-style schedulers in particular use six or seven fields. Confirm how many fields your runner expects before copying an expression over.
Can I run a job every 90 minutes? Not cleanly, because cron fields do not span across the hour boundary. A step like */90 in the minute field is invalid. You would schedule the specific minutes and hours, or run every 30 minutes and skip in code.