Cron Expression Parser
Parse cron expressions into human-readable schedules with next run times.
Reviewed by Aygul Dovletova · Last reviewed
Cron Syntax Reference
| Symbol | Meaning | Example |
|---|---|---|
| * | Any value | * * * * * |
| , | List of values | 1,15 * * * * |
| - | Range of values | * 9-17 * * * |
| / | Step values | */15 * * * * |
How to Use the Cron Expression Parser
- Type or paste a cron expression into the input box - for example
*/15 9-17 * * 1-5for every 15 minutes between 9am and 5pm on weekdays. - Click Parse or press Enter. The tool validates the expression, flags any invalid field, and produces a plain-English description ("At every 15th minute past every hour from 9 through 17, Monday through Friday").
- Inspect the field breakdown table. Each of the five fields (minute, hour, day-of-month, month, day-of-week) is annotated with what its current value means.
- Scroll the next-execution list. The tool computes the next five times the expression would fire against your local clock and shows them as full timestamps.
- Try the presets if you are unsure - "hourly", "daily at midnight", "weekdays at 9", and others load into the input as starting points you can tweak.
What This Tool Does and How It Works
Cron expressions encode recurring schedules as a compact set of time-field patterns. The parser first tokenizes your input on whitespace, then classifies each field against the grammar: wildcard (*), single value (5), range (1-5), list (1,15,30), or step (*/10, 1-5/2). Name-based aliases like JAN, MON, TUE are normalized to numeric equivalents before matching. Field bounds are validated against their allowed ranges - 0-59 for minutes, 0-23 for hours, 1-31 for day-of-month, 1-12 for months, 0-6 for day-of-week (where both 0 and 7 can mean Sunday in some implementations).
Computing the next execution times requires iterating forward through time and matching each candidate timestamp against the field patterns. The tool starts from new Date(), normalizes to minute precision, and walks forward minute-by-minute until it finds five matches, returning them in local time for display. This brute-force approach is simpler than the field-by-field "next valid slot" algorithms used by production cron schedulers, but it is fast enough for five occurrences and transparent enough to debug. Everything runs in the browser - there is no server round-trip, so invalid expressions are flagged within a frame of the click.
When You Would Use a Cron Expression Parser
- Authoring a new schedule for a GitHub Actions workflow, a Jenkins trigger, or a Kubernetes CronJob and wanting a sanity check before committing.
- Debugging a schedule that is firing at unexpected times by seeing the exact next-run timestamps the parser produces against your local clock.
- Translating a cron expression from a log line or an email alert into something human-readable for a handoff document or runbook.
- Teaching junior engineers what the fields mean - the field breakdown table is explicit in a way the terse crontab man page is not.
- Verifying that a vendor\'s scheduling UI (Airflow DAG, AWS EventBridge, Cloudflare Cron Triggers) is producing the expression you think it is.
- Planning maintenance windows where you want to see whether an existing schedule will collide with a new deployment.
Common Pitfalls and Edge Cases
The most common cron bug is the day-of-month / day-of-week interaction. In Vixie/POSIX cron, if both fields are restricted (neither is *), the job runs when either matches - not both. So 0 0 15 * 1 fires on every 15th and every Monday, which is almost never the intent. Other traps: 31 in day-of-month silently skips short months; 29 2 29 2 * fires only on February 29th (leap years); Sunday is both 0 and 7 in many implementations; timezone is the cron daemon\'s local zone, so "3am" can run at 8am for a user in a different region. Step values like */15 start from the first valid value, not "15 minutes from now". Nonstandard symbols (?, L, W, #) are Quartz extensions and not supported by this POSIX-only parser.
Cron in Context: POSIX, Quartz, and Cloud Dialects
The original Unix cron, written by Ken Thompson at Bell Labs in the 1970s and later expanded by Paul Vixie into Vixie cron, uses a 5-field expression covering minute through day-of-week. POSIX codified the format, and every Unix-like system plus most CI systems (Jenkins, CircleCI, GitHub Actions), Kubernetes CronJobs, and infrastructure-as-code platforms accept it. Quartz - the Java scheduling library - extends to 6 or 7 fields by prepending seconds and optionally appending year, adding special characters: L (last day of month), W (nearest weekday), # (nth weekday of month), and ? (disambiguator). AWS EventBridge uses a 6-field Quartz-like variant with its own quirks. The @yearly, @monthly, @weekly, @daily, @hourly, and @reboot shortcuts are recognized by most Unix crons but not by every cloud scheduler; @reboot specifically runs once at daemon startup rather than on a recurring schedule.
Comparison to Alternatives
crontab.guru is the most popular online cron decoder - excellent for the standard 5-field form plus a cleaner URL-sharing story. cronitor.io adds monitoring on top of parsing. For Quartz-specific expressions, the cron-utils Java library handles every dialect natively. For CLI use, croniter (Python) or cron-parse give you scriptable parsing. Against any of these, this tool\'s niche is transparent in-browser parsing with copyable next-run timestamps, without signing up or leaving the tab. It loses when you need Quartz special characters (L, W, #, ?) or to validate against a specific vendor\'s parser - in those cases, use the vendor\'s own schedule preview.
Frequently Asked Questions
What is the structure of a 5-field cron expression?
Left to right: minute (0-59), hour (0-23), day-of-month (1-31), month (1-12 or JAN-DEC), day-of-week (0-6 or SUN-SAT, where 0 and 7 both mean Sunday). Fields separated by whitespace, each accepting literal, list (comma), range (hyphen), wildcard (asterisk), or step (slash). "0 9 * * 1-5" means "at 09:00 Monday through Friday" - the standard weekdays-at-9am schedule.
What is the difference between POSIX 5-field cron and Quartz 6-field cron?
POSIX cron has 5 fields and minute resolution. Quartz adds a seconds field at the front (6 fields total, enabling sub-minute schedules), an optional trailing year field (7 fields), and special characters L (last), W (nearest weekday), # (nth weekday-of-month), and ? (disambiguator). AWS EventBridge uses a 6-field dialect close to Quartz but with its own twists. This tool parses the 5-field POSIX form; 6/7-field Quartz expressions will error on the extra fields.
What does @reboot do and why is it special?
@reboot is not a time-pattern expression - it schedules a command to run once when the cron daemon starts up. Most Unix-family crons recognize it along with @yearly, @monthly, @weekly, @daily, and @hourly, which do correspond to standard 5-field equivalents. Cloud schedulers almost universally do not support @reboot because their job pools have no notion of "daemon startup" - they are always-on. This parser treats the 5-field expressions; for @reboot and the @special shortcuts, refer to your cron implementation's docs.
Why does the day-of-month and day-of-week interaction cause bugs?
In Vixie/POSIX cron, when both day-of-month and day-of-week are restricted (neither is an asterisk), the job runs when either matches, not both. So "0 0 15 * 1" triggers on every 15th of the month AND every Monday. Most people read the expression as an AND. If you want AND semantics, you need a different scheduler or a wrapping condition inside the job itself. Quartz avoids this with the ? character which explicitly says "ignore this field".
How does the tool handle timezones for next-execution times?
The parser computes next-run timestamps using the browser's local timezone. Your actual cron daemon - on a Linux server, a container, or a cloud platform - may be running in UTC or a different zone entirely, in which case the times shown here will be offset from reality. Check your cron host's timezone (on Linux, /etc/timezone or `date` output) and adjust. For cloud schedulers like GitHub Actions, most default to UTC.
What does */5 mean, and where does it start counting?
The slash step operator means "every Nth value starting from the lowest match". So */5 in the minute field produces 0, 5, 10, 15, ..., 55 - it starts at 0 (the lowest valid minute) and steps by 5. Crucially, it does NOT mean "every 5 minutes from now". Ranges can be stepped too: 10-20/3 means "in the range 10 to 20, every 3 values", producing 10, 13, 16, 19.
Can I use month and day names like JAN or MON?
Yes. Three-letter abbreviations are a POSIX-blessed alternative to numbers: JAN through DEC for months, SUN through SAT for days-of-week. The parser normalizes them to numeric equivalents before matching. Ranges and lists can mix them (MON-FRI, JAN,JUN,DEC). Case differences and some longer names are typically accepted.
Is my cron expression sent to any server for parsing?
No. Tokenization, validation, field breakdown, and next-execution computation all happen in JavaScript inside your browser tab. There is no fetch call when you click Parse, and no telemetry carries the expression text. This matters because production schedules sometimes encode customer IDs, tenant names, or internal project codes that you reasonably prefer to keep off someone else's server.
Why is there no sub-minute precision?
POSIX cron is minute-resolution. There is no seconds field - a deliberate 1970s-era design choice where the cron daemon wakes up roughly once per minute and checks for jobs. Quartz and some modern schedulers (AWS, Azure Functions, Kubernetes with extensions) add seconds, but the 5-field standard does not. For sub-minute scheduling you need a different class of tool - a message queue, a systemd timer with OnCalendar, or a dedicated job runner.
More Developer Tools
Base64 Encoder & Decoder
Encode UTF-8 text to Base64 online or decode Base64 back to UTF-8 and plain text. Runs in your browser with no upload.
Open toolBulk URL Encode / Decode
Encode or decode many URLs at once. Paste a newline-separated list and the tool processes each line in parallel, preserving order and blank lines.
Open toolCode Screenshot
Create beautiful code snippet images with customizable themes.
Open toolColor Converter
Convert colors between HEX, RGB, HSL and CMYK formats.
Open toolCSS Formatter / Minifier
Format, beautify and minify CSS code.
Open toolCSV to JSON Converter
Convert CSV data to JSON array format.
Open tool