Build cron schedules visually in standard 5-field or Quartz 6-field syntax, with plain-English descriptions and next run times.
0 9 * * 1-5This tool runs 100% in your browser. All computation happens locally on your device — your input is never uploaded to any server. Results are for reference only.
A cron expression is just five time fields separated by spaces, one per time dimension: minute, hour, day-of-month, month, day-of-week. Combined, they describe one repeating instant. Quartz prepends a seconds field, making it six.
Each field is a filter the scheduler checks. '*' matches every value; '1-5', '*/15' and '5,17' are ranges, steps and lists. A job only fires when every field drops out true.
Progressive example, from trivial to precise.
To generate a cron expression: select your schedule (every 5 minutes, daily at 9am, etc.) — the tool outputs the cron syntax and a plain-English description of what it does.
FreeToolHub Cron Generator is a free browser-based tool that creates cron expressions with human-readable descriptions, no signup.
Build cron schedules visually with dialect switching (standard 5-field and Quartz 6-field), human-readable descriptions, and next 5 run times. Free, no signup, 100% in-browser.
This tool builds cron expressions visually instead of from memory, and it speaks two dialects: the standard five-field Unix syntax used by crontab, and the six-field Quartz syntax used by Spring, Jenkins, Salesforce, and most Java schedulers. Pick your schedule from twelve common presets - daily at midnight, every hour, weekdays at 9, weekly, monthly, every N days - or assemble any schedule field by field, and it emits the expression with a human-readable plain-English description of what it will do. It also computes the next five run times so you can verify the expression actually fires when you think, the step that prevents the classic silent cron mistake.
Developers configuring scheduled jobs in crontab, CI/CD pipelines, Kubernetes CronJobs, or cloud schedulers without keeping cron syntax in their head. Java and Spring developers who need the Quartz seconds field and the ? placeholder, and who constantly mix up Quartz day-of-week numbering (1 = Sunday) with standard cron numbering (0 = Sunday). Ops engineers writing backup, cleanup, and report schedules who need to confirm next-run behavior before committing. Anyone migrating an expression between systems and needing to check whether 0 9 * * 1 means the same thing in both.
(1) Choose your dialect with the toggle - Standard 5-field or Quartz 6-field; the field row updates to show seconds and the correct weekday numbering. (2) Start from a preset closest to your intent, or fine-tune fields individually - each focused field exposes the quick values that are legal there, including L, W, and # when the dialect supports them. (3) Read the human-readable description, which explains special characters in plain English, and check the next five run times rendered from your local clock. (4) Copy the expression into crontab, a Spring @Scheduled annotation, a Jenkins trigger, or a scheduler config.
A standard cron expression is five space-separated fields: minute (0-59), hour (0-23), day of month (1-31), month (1-12), and day of week (0-6, Sunday = 0). Quartz expands this to six required fields by adding seconds at the front (and an optional year at the end), changes day-of-week to 1-7 with Sunday = 1, and adds the special characters ? (no specific value, day fields only), L (last day of month or last weekday), W (nearest weekday), and # (nth weekday of the month). The expression 0 9 * * 1-5 fires at 9:00 AM Monday through Friday in standard cron; the Quartz equivalent is 0 0 9 * * ? or, for 9:30 sharp, 0 30 9 * * ?. The trap that causes most production incidents: when both day fields are restricted in standard cron they are OR-ed - 0 0 1 * 1 fires on the first of the month AND every Monday. Quartz avoids this by requiring ? in one of the two day fields. Cron uses the server local timezone unless TZ is set, so a UTC server running 0 9 * * * fires at 4 AM in New York during standard time. Before committing any schedule, paste the expression into the next-runs preview here - thirty seconds of verification beats a month of silently missed backups.
Dialect differences. Classic Vixie cron uses five fields (minute hour day month weekday); Quartz adds a leading seconds field and a trailing year, and uses ? for unused day fields; some systems accept @daily shorthands while others do not. An expression that works on Linux will often be rejected by a Quartz scheduler and vice versa. Pick the dialect first - the generator writes and validates against that dialect's grammar.
* means every value in the range (every minute, every day). /n steps through the range: */15 in the minutes field means every 15th minute (0, 15, 30, 45). Ranges with steps like 10-40/10 give 10, 20, 30, 40. Combining them wrong is the classic cron bug - */5 in hours is not 'every 5 hours from midnight' on all dialects unless the range is explicit (0-23/5). The live preview shows the next five runs so misreadings surface immediately.
The server's timezone, not yours - the single most common cron surprise. A 9 AM job on a UTC server runs at 2 AM in Los Angeles, which is fine until daylight saving shifts one side. Most managed schedulers (Cloudflare Cron Triggers, GitHub Actions) run UTC and let you offset in code; some (App Engine, Kubernetes CronJob) support explicit timezones. Generate the expression here, then check where the platform that will run it anchors midnight.
Both, in standard cron - 0 and 7 are accepted names for Sunday, while 1-6 are Monday through Saturday. Quartz differs: 1 is Sunday and 7 is Saturday (SUN-SAT names work everywhere). A hand-written expression using 7 for Saturday in Quartz means Sunday instead. This is exactly the class of error the dialect-aware validation catches: same digits, different calendar.
A standard cron expression has 5 fields: minute (0-59), hour (0-23), day-of-month (1-31), month (1-12), and day-of-week (0-7, where 0 and 7 are Sunday). For example, 0 9 * * 1-5 runs at 9:00 AM Monday through Friday. This tool supports the standard 5-field syntax and the Quartz 6-field syntax, then shows the next 5 run times.
Quartz adds a leading seconds field (making 6 required fields) and an optional trailing year field, uses 1-7 or SUN-SAT for day-of-week (1 = Sunday, unlike standard cron where 0 = Sunday), and supports special characters ? L W and # in day fields. 0 0 9 * * ? means 9:00:00 AM every day in Quartz, while the 5-field standard equivalent is 0 9 * * *. Switch the dialect toggle above to convert between them.
L means last - L in day-of-month is the last day of the month, and 6L in day-of-week is the last Friday of the month. W stands for weekday - 15W fires on the weekday nearest the 15th, staying inside the same month. # picks the nth weekday - 3#2 means the second Monday of the month. All three are Quartz-only and are described in plain English by this tool when you use them.
The tool displays next 5 run times in your local timezone. Cron jobs on servers typically run in UTC - if your server is in UTC and you need a 9 AM EST job, the cron expression would be 0 14 * * 1-5 (14:00 UTC = 9:00 AM EST). The tool shows both the human-readable description and the exact cron string.
This tool is also known by these tasks — each link opens the same tool with a focused guide:
Why did the cow cross the road?
No signups, no data sold. The core of every tool is free forever — the optional Pro plan adds batch processing, unlimited downloads, white-label exports and an ad-free experience.
☕Support me on Ko-fi— keep tools free100% of proceeds go towards hosting & building more free tools.