Cron Expression Generator
Build or decode Unix cron expressions. Get a plain-English description and the next 5 scheduled run times. Runs entirely in your browser.
Common Schedules
0
Minute
0โ59
*
Hour
0โ23
*
Day (Month)
1โ31
*
Month
1โ12
*
Day (Week)
0โ7
Plain English
Runs at minute 0, every hour.
Next 5 Scheduled Runs
- 19/7/2026, 10:00:00 PM
- 29/7/2026, 11:00:00 PM
- 39/8/2026, 12:00:00 AM
- 49/8/2026, 1:00:00 AM
- 59/8/2026, 2:00:00 AM
Cron Syntax Reference
| Special character | Meaning | Example |
|---|---|---|
| * | Any value / every | * โ every minute/hour/day |
| , | Value list | 1,15,30 โ at 1, 15, and 30 |
| - | Range | 1-5 โ 1 through 5 |
| / | Step value | */15 โ every 15 units |
Cron Syntax, Field Logic & Scheduling in Plain English
What This Tool Actually Does
This generator does three things with a standard 5-field cron expression, entirely in your browser: it validates the syntax, translates it into a plain-English description, and simulates forward minute-by-minute from the current time to compute the next 5 timestamps that would actually trigger. Each field โ minute, hour, day-of-month, month, day-of-week โ is parsed independently, so the field breakdown grid always shows exactly what value is currently sitting in each slot, along with its valid range.
Twelve common presets (every minute, every 5/15/30 minutes, hourly, every 6 hours, daily, every weekday at 9am, weekly, monthly, yearly) are one click away, or you can type any valid expression directly into the large input field, which turns red with a highlighted border if the syntax is invalid.
How to Use It
- Click one of the Common Schedules preset buttons, or type your own expression directly into the field.
- Check the 5-box field breakdown underneath โ each box shows the raw value and valid range for Minute, Hour, Day (Month), Month, and Day (Week).
- Read the Plain English panel for a human-readable summary of when the job runs.
- Check Next 5 Scheduled Runs for the actual upcoming timestamps, computed in your browser's local time.
- Click Copy to grab the raw expression for pasting into your crontab, a WordPress plugin setting, or a CI/CD YAML file.
- Refer to the Cron Syntax Reference table for what
*,,,-, and/mean.
The Underlying Mechanism: 5-Field Cron Syntax
A cron expression is five space-separated fields, always in this order: minute (0โ59), hour (0โ23), day of month (1โ31), month (1โ12), and day of week (0โ7, where both 0 and 7 mean Sunday). Each field accepts * for "any value," a comma-separated list (1,15,30), a range (1-5), a step value (*/15 or 10-20/2), or a single number.
The trickiest rule in cron syntax is how Day of Month and Day of Week interact when both are restricted to something other than *: the job fires when either condition is true, not when both are true simultaneously (OR logic, not AND). This tool implements that rule exactly โ you can see it in how the simulator decides a day matches: if both fields are wildcards it always matches, if only one is a wildcard it uses the other exclusively, and if neither is a wildcard it accepts a day matching either one.
To compute upcoming run times, the tool starts one minute after the current time and steps forward minute by minute (capped at 100,000 iterations, roughly 69 days of simulated time), checking each candidate minute against all five parsed fields until it collects 5 matches. This is a brute-force simulation rather than a closed-form calculation, which is why extremely rare expressions can take a moment or return nothing within the search window.
Worked Example
Load the Every 15 minutes preset: */15 * * * *. The field breakdown shows Minute = */15, and every other field as *. The Plain English panel reads "Runs every 15 minutes, every hour." โ accurate, if slightly redundant in phrasing, since both fields independently render as step/wildcard text. The Next 5 Scheduled Runs panel lists five real upcoming timestamps exactly 15 minutes apart, computed from whatever moment you loaded the page.
Now load Every weekday at 9am: 0 9 * * 1-5. The Next 5 Scheduled Runs panel correctly computes real timestamps for Monday through Friday at 9:00 AM only, skipping Saturday and Sunday โ the underlying range logic works correctly. But the Plain English panel currently renders the Day of Week range as on Mon, Fri rather than expanding it to "Monday through Friday," because the description function only extracts the two boundary values from the 1-5 token instead of expanding the full range. The schedule itself is correct; only the plain-English sentence undersells it.
Practical Use Cases
- Configuring a real server cron job for WordPress: After disabling WP-Cron's page-load-triggered execution, build the exact crontab line that calls
wp-cron.phpon a fixed schedule instead. - Scheduling database backup jobs: Build an off-peak expression (e.g. daily at 3am) for a backup script or plugin that needs a specific low-traffic execution window.
- Cache-warming and report generation: Decide on and verify an hourly or every-6-hours cadence for a cache-priming script or a scheduled analytics export.
- CI/CD scheduled pipelines: Build the cron expression for a GitHub Actions
schedule:trigger or a similar scheduled workflow YAML field. - Decoding an unfamiliar expression: Paste in a cryptic cron line found in an existing crontab or plugin config to understand exactly what it does before touching it.
Common Mistakes & Limitations
- Misreading the Day of Month / Day of Week interaction: Setting both fields to specific values doesn't mean "this day of the month AND this day of the week" โ it means either condition triggers the job, which surprises many people building their first non-trivial schedule.
- Trusting the plain-English text for ranges and lists: As shown above, ranges in the Month and Day-of-Week fields aren't always fully expanded in the summary sentence โ always cross-check against the Next 5 Scheduled Runs panel, which is computed from the real parsed logic.
- Assuming the preview matches your server's timezone: The next-run simulation uses your browser's local clock. If your cron daemon runs in UTC, the wall-clock times shown here will differ from actual execution times even though the pattern is identical.
- Forgetting WordPress's own WP-Cron quirk: Standard WP-Cron only fires on a page visit, not on a true fixed schedule โ for expressions that must run reliably at exact times, you still need a real system-level cron job calling
wp-cron.phpwithDISABLE_WP_CRONset. - Extremely rare expressions may return no preview results: The simulator only looks about 69 days into the future, so expressions matching very infrequent dates might show an empty Next Runs list despite being syntactically valid.
Frequently Asked Questions
What is a cron expression?
A cron expression is a string of 5 space-separated fields that defines when a recurring task should run on Unix-like systems. The fields represent: Minute (0โ59), Hour (0โ23), Day of Month (1โ31), Month (1โ12), Day of Week (0โ7, where 0 and 7 both mean Sunday).
How do I schedule a WordPress cron job?
WordPress has its own WP-Cron system that triggers on page loads. For reliable server-level scheduling, disable WP-Cron (define("DISABLE_WP_CRON", true) in wp-config.php) and add a real server cron job that calls wp-cron.php at your desired interval using wget or curl.
What does * mean in a cron field?
* means "every" โ every minute, every hour, every day, etc. For example, * * * * * runs every minute of every hour every day.
What is the difference between Day of Month and Day of Week?
They are separate fields but interact: if you set both to non-*, the job runs when EITHER condition is true (OR logic). To run only on weekdays, set Day of Month to * and Day of Week to 1-5.
Does the "Next 5 Scheduled Runs" list use my timezone or my server's timezone?
It uses your browser's local timezone, since the simulation runs entirely client-side using JavaScript Date objects. If your production server (or WP-Cron) runs in UTC or a different timezone than your browser, the exact wall-clock times shown here won't match server execution times โ the underlying pattern logic (which minutes/hours/days it matches) is correct, but always confirm your server's configured timezone separately.
Why does the next-run list come back empty for my expression?
The simulator searches forward minute-by-minute for up to 100,000 iterations (about 69 days) before giving up. An expression that only matches a rare date โ like 0 0 29 2 * (February 29th) outside a leap year โ may not produce any results within that window even though the expression itself is valid.
Is the plain-English description always fully accurate?
It's a simplified summary, not a complete restatement. For single values and step values (like */15) it's precise, but for ranges and comma-lists in the Month and Day-of-Week fields, the summary currently renders only the individual tokens it sees rather than expanding a range โ for example 1-5 in Day of Week may display as "Mon, Fri" instead of "Monday through Friday." The Next 5 Scheduled Runs panel always reflects the true, fully-expanded schedule, so treat it as the source of truth over the plain-English line for ranges.
Can I use shortcuts like @daily or @reboot instead of 5 fields?
No โ this tool works with standard 5-field cron syntax only (minute, hour, day-of-month, month, day-of-week). Shorthand macros like @daily, @hourly, or @reboot are a convenience layer some cron implementations (like Vixie cron) support, but they aren't part of the base 5-field standard this generator validates. Use the equivalent explicit expression instead โ @daily is the same as 0 0 * * *.
