Cron Jobs Explained: A Plain-English Guide to Cron Syntax
Cron has been the standard way to schedule recurring tasks on Unix-like systems since the 1970s, and in all that time its core syntax has barely changed โ which is both a testament to how well it works and the reason it still trips people up today. A cron expression packs a surprising amount of scheduling logic into a short string, and that compactness comes directly at the expense of being readable at a glance.
The five fields, in order
A standard cron expression has five space-separated fields, always in the same order: minute, hour, day of month, month, and day of week. A schedule like 0 9 * * 1-5 reads, field by field, as "at minute 0, hour 9, any day of the month, any month, on days 1 through 5 of the week" โ which translates to 9:00 AM, Monday through Friday. The asterisk in a field means "every value is fine here," which is why two of the five fields in that example are asterisks: the schedule doesn't care what day of the month or what month it is, only the time and the day of the week.
Why this is genuinely hard to read, not just unfamiliar
Part of the difficulty is real unfamiliarity โ most people simply don't work with cron often enough to build fluency with it. But part of it is a genuine design tradeoff: the syntax uses very similar-looking symbols to mean quite different things, and there's no visual distinction between them beyond position. A comma-separated list like 1,15 means "on the 1st and the 15th," while a range like 1-15 means "every day from the 1st through the 15th" โ visually similar, semantically very different, and easy to misread quickly, especially in someone else's schedule that you didn't write yourself. A step value like */15 adds a third pattern entirely, meaning "every 15 units," which looks nothing like either of the other two but is just as commonly used.
The day-of-week field has its own quirk
The day-of-week field numbers Sunday as 0 (and, in most implementations, also accepts 7 as an alternate value for Sunday), with Monday through Saturday as 1 through 6. This is a common source of off-by-one confusion for anyone assuming Monday is day 1 the way it commonly is in calendar contexts โ in cron, Monday is day 1, but Sunday can be either 0 or 7 depending on which end of the week you're thinking from.
Getting a schedule right without memorizing every rule
Rather than working through all five fields manually every time you need to read or write a schedule, our Cron Expression Builder translates a cron string directly into a plain-English description of exactly when it'll run โ catching the kind of misread schedule that could otherwise mean a script runs at 9 AM instead of 9 PM, or runs every day instead of only on weekdays, a mistake that's genuinely easy to make reading dense cron syntax quickly.
A few common patterns worth recognizing
0 0 * * *โ once a day, at midnight.*/15 * * * *โ every 15 minutes, all day, every day.0 9 * * 1-5โ 9 AM, Monday through Friday only.0 0 1 * *โ midnight on the first day of every month.0 0 * * 0โ midnight every Sunday.
Cron syntax isn't going anywhere โ it remains the standard scheduling format across a huge range of servers and systems decades after it was introduced, precisely because it's compact and powerful once you know how to read it. The compactness just means it's worth double-checking a schedule with a plain-English translation before trusting it, rather than assuming a quick read of the raw syntax caught every detail correctly.