⚙️ Developer Tools Free Forever

Cron Expression Builder & Next Run Time Calculator

Type a standard 5-field cron expression or build one from a simple form. You get a plain-English description and the next run times in your local time or UTC, all calculated in your browser.

Cron ExpressionFormat: minute hour day-of-month month day-of-week
Calculate Runs Starting From (optional)Leave blank to start from right now.
About This Tool

How this cron builder parses five fields and simulates real run times

A cron expression is compact by design, which is exactly what makes it easy to misread. This tool does two things a schedule string alone cannot: it turns the five fields into a plain English sentence, and it actually simulates the clock, minute by minute, to show the next ten real timestamps your job would fire at. Nothing is guessed from pattern matching against a lookup table of known expressions. It runs the same matching logic a cron daemon would.

The parser, the description generator, and the simulation all run in your browser with plain JavaScript Date objects. There is no server component, so the schedule you are testing is never transmitted anywhere.

Parsing the five fields

A standard cron string is minute hour day-of-month month day-of-week. The tool rejects anything that does not split into exactly five whitespace-separated fields, then parses each one independently against its own valid range.

FieldAllowed rangeSpecial names accepted
Minute0-59None
Hour0-23None
Day of month1-31None
Month1-12JAN through DEC
Day of week0-7SUN through SAT, both 0 and 7 mean Sunday

Each field supports the standard cron syntax: a bare wildcard *, comma-separated lists like 1,15,30, dash ranges like 9-17, and step values like */15 or 10-20/2. The parser expands every one of these into a concrete sorted array of matching numbers rather than keeping the pattern symbolic, which is what makes the plain-English description and the run-time simulation both work off the same normalized data.

// simplified from parseField() in the tool source part.split('/').forEach(function() {}); if (rangePart.indexOf('-') !== -1) { var rp = rangePart.split('-'); start = normalizeToken(rp[0], names); end = normalizeToken(rp[1], names); } for (var v = start; v <= end; v += step) { allowed[v] = true; }

The day-of-month OR day-of-week rule

This is the part of cron syntax that trips people up most. When both day-of-month and day-of-week are restricted (neither is a wildcard), a real cron daemon treats them as an OR, not an AND. Setting day-of-month to 15 and day-of-week to Monday means the job runs on the 15th of every month, plus every Monday, not only on Mondays that happen to fall on the 15th. This tool implements that exact rule rather than the more intuitive looking AND that a naive implementation would default to. One more detail from Vixie cron and cronie: if either day field starts with an asterisk, such as */2, the two fields are combined with AND instead.

Step 1 Start the clock The search begins at your chosen start minute, or at the next full minute after now if none is set.
Step 2 Test each minute Candidates are checked against all five parsed fields using the day rule above. When a month, day or hour cannot match, the search jumps straight to the next one instead of testing every minute.
Step 3 Collect ten matches Matching timestamps are collected until the list holds the number of runs you picked: 5, 10, 25 or 50.
Step 4 Bounded search window The search stops after 28 years even if fewer matches were found, and it returns at once with a clear message for an expression like 0 0 30 2 * that can never actually match, since February never has a 30th.
Local time or UTC, your choice. By default run times use your browser's time zone. Most servers run cron in UTC, so a schedule fires at a different wall-clock moment than your local preview suggests. Switch Show times in to UTC to see exactly what the server will do. Each row also shows the time in the other zone.
Plain-English description

Built from pattern rules on the raw field text, for example detecting a leading */ to describe step intervals, or a single numeric value in both minute and hour fields to describe an exact daily time like "At 09:00."

Custom start date

Instead of always simulating from the current moment, you can set a specific starting timestamp, useful for checking what a schedule would have produced starting from a past deploy date.

Common presets

One-click buttons load known-good expressions like 0 9 * * 1-5 for weekday mornings, so you can see correctly formed syntax before writing your own from scratch.

5-field standard cron Minute-resolution simulation OR logic for day fields

Cron implementations and documentation

Jobs people schedule with cron

Verifying a new crontab line before deploying it to a production server, checking whether a Kubernetes CronJob manifest's schedule field will actually fire when you expect, debugging why a scheduled task ran on an unexpected day because of the day-of-month/day-of-week OR rule, translating a colleague's cryptic five field string into something you can explain in a code review, and previewing the effect of a step interval like */15 before committing it to a monitoring or backup job.

Common Questions

FAQ: Cron Expression Builder

In order, they are: minute (0-59), hour (0-23), day-of-month (1-31), month (1-12 or JAN-DEC), and day-of-week (0-6 or SUN-SAT, where both 0 and 7 mean Sunday). A job runs only when the current time matches every field's constraint, subject to the special OR rule that applies when both day-of-month and day-of-week are restricted.

An asterisk means 'every value is allowed' for that field, it's a wildcard that matches any minute, hour, day, month, or weekday. A cron expression of `* * * * *` means the job runs every single minute, with no restriction on any field.

A comma denotes a list of specific values, so `1,15` means only the 1st and the 15th of the month. A hyphen denotes a continuous range, so `1-15` means every day from the 1st through the 15th inclusive. Mixing them up is one of the most common cron mistakes, since both look similar but produce very different schedules.

This is a well known quirk of the standard cron specification: when neither field is a wildcard, the job runs if the current date matches EITHER condition, not both. For example, `0 0 1 * 1` runs at midnight on the 1st of every month AND on every Monday, not only on Mondays that happen to fall on the 1st.

A step value divides a field's full range into equal intervals starting from its minimum, so `*/15` in the minute field means every 15th minute starting at 0, producing runs at :00, :15, :30, and :45. Steps can also apply to a sub-range, like `10-40/10`, which would fire at 10, 20, 30, and 40.

Yes, this tool accepts standard three-letter abbreviations, JAN through DEC for months and SUN through SAT for weekdays, in addition to their numeric equivalents, and you can mix names and numbers across different fields if you like.

Some valid but rare cron expressions, most notably schedules tied to February 29th, only occur on leap years, which happen roughly once every four years. A 28 year search window finds several of these leap-day runs, and because the search skips whole months and days that cannot match, it still finishes instantly.