Parse cron expressions: schedule explanation, next run times, validator. Generate cron: every hour, daily, weekly, monthly. Crontab syntax reference.
Use this free online Cron Expression Parser directly in your browser. No signup required, no data leaves your device. Part of Utilier — a collection of 133+ developer utilities.
What is Cron Expression Parser & Generator (Schedule, Next Run, Validator)?
Cron expression parser decodes cron syntax (scheduled task format used in Unix/Linux cron, Kubernetes CronJobs, CI/CD pipelines) into human-readable schedules. Parses: 5-field (* * * * *: minute, hour, day, month, weekday) and 6-field (second support). Explains: '0 9 * * 1' = 'Every Monday at 9:00 AM', '*/15 * * * *' = 'Every 15 minutes'. Features: next run calculator (shows next 10 execution times), validator (syntax errors: invalid range, out-of-bounds values), generator (create cron from description: 'every hour' → '0 * * * *'), common patterns library (every day, every week, last day of month). Reverse: generates cron from schedule (select frequency, time → cron expression).
Special characters: * (any): every value. */15: every 15 (minutes, hours). 1-5: range (Mon-Fri). 1,15: list (1st, 15th). ? (any, day/weekday): used when other specified. L (last): last day of month. # (nth): 3rd Monday (1#3).
Human explanation: 0 9 * * 1 → 'At 9:00 AM, only on Monday'. */30 * * * * → 'Every 30 minutes'. 0 0 1 * * → 'At midnight, on day 1 of the month'. Instant understanding (no manual decoding).
Next run calculator: Shows next 10 execution times with dates/times. Example: cron 0 9 * * 1 → next runs: Mon Jan 22 9:00 AM, Mon Jan 29 9:00 AM, Mon Feb 5 9:00 AM... Verify schedule before deploying.
Cron generator: Select: frequency (every minute, hourly, daily, weekly, monthly), time (9:00 AM), day (Monday, 1st of month). Generates cron: 0 9 * * 1 (Mon 9 AM). No manual syntax (point-and-click).
Enter cron expression, see explanation and next runs. Or generate cron from description.
Parse existing cron: Enter expression: 0 9 * * 1 (5 fields: min, hour, day, month, weekday). Or 6-field: 0 0 9 * * 1 (with seconds). Click Parse → see explanation: 'At 9:00 AM, only on Monday'.
View next run times: Shows next 10 executions with dates/times: Mon Jan 22 9:00 AM, Mon Jan 29 9:00 AM, Mon Feb 5 9:00 AM... Verify: runs when expected? Correct timezone shown.
Validate syntax: Tool checks: valid ranges (minute 0-59, hour 0-23), correct separators (spaces), special chars (* / - , ? L #). Errors shown: 'Hour 25 out of range (0-23)'.
Generate cron (alternative): Switch to Generator. Select: frequency (hourly, daily, weekly), time (9:00 AM), day (Monday, 1st). Tool generates: 0 9 * * 1. Copy cron expression.
Use presets (common patterns): Click preset: 'Every hour' → 0 * * * *, 'Every day at midnight' → 0 0 * * *, 'Every weekday at 9 AM' → 0 9 * * 1-5. Customize if needed.
Test edge cases: Check: Feb 30 (doesn't exist: job skips), month with 31 days (0 0 31 * * = Jan, Mar, May, Jul, Aug, Oct, Dec only). Next runs show skipped dates.
Human-readable explanation: Cron → English. 0 9 * * 1 → 'At 9:00 AM, only on Monday'. */15 * * * * → 'Every 15 minutes'. 0 0 1 * * → 'At midnight, on day 1 of the month'. Instant understanding.
Next run calculator: Shows next 10 execution times: dates + times in local timezone. Example: Mon Jan 22 2024 9:00 AM, Mon Jan 29 2024 9:00 AM... Verify schedule accuracy before deploying.
Syntax validator: Checks: 5-field or 6-field format, valid ranges (min 0-59, hour 0-23, day 1-31, month 1-12, weekday 0-6), special chars valid (* / - , ? L #). Shows errors with suggestions.
Cron generator (reverse): Select schedule → generates cron. Frequency: every minute, every N minutes, hourly, daily, weekly, monthly, yearly. Time picker: hour, minute. Day picker: Monday, 1st of month. No manual syntax.
Common presets library: One-click presets: 'Every minute' (* * * * *), 'Every hour' (0 * * * *), 'Every day at midnight' (0 0 * * *), 'Every weekday at 9 AM' (0 9 * * 1-5), 'Last day of month' (0 0 L * *).
Timezone support: Shows next runs in: local timezone (auto-detected), UTC, custom timezone. Cron runs in server timezone (important: UTC server → cron runs UTC time, not local).
6-field support (seconds): Standard cron: 5 fields (minute onwards). Some systems: 6 fields (seconds + 5). Example: 30 0 9 * * * = 9:00:30 AM. Tool supports both (auto-detects).
Common use cases
Daily backup (midnight): Cron: 0 0 * * *. Explanation: 'At midnight (12:00 AM)'. Next runs: Jan 22 12:00 AM, Jan 23 12:00 AM... Use for: database backups, log rotation, cleanup tasks.
Nightly build (2 AM weekdays): Cron: 0 2 * * 1-5. Explanation: 'At 2:00 AM, Mon-Fri'. Next runs: Mon Jan 22 2:00 AM, Tue Jan 23 2:00 AM (skips weekends). CI/CD: nightly tests, builds.
Every 15 minutes (monitoring): Cron: */15 * * * *. Explanation: 'Every 15 minutes'. Next runs: 9:00, 9:15, 9:30, 9:45, 10:00... Use for: health checks, monitoring, data sync.
Weekly report (Monday 9 AM): Cron: 0 9 * * 1. Explanation: 'At 9:00 AM, only on Monday'. Next runs: Mon Jan 22 9:00 AM, Mon Jan 29 9:00 AM... Weekly summary emails, reports.
Monthly billing (1st of month): Cron: 0 0 1 * *. Explanation: 'At midnight, on day 1 of the month'. Next runs: Feb 1 12:00 AM, Mar 1 12:00 AM... Invoice generation, subscription renewals.
Last day of month (cleanup): Cron: 0 0 L * *. Explanation: 'At midnight, on the last day of the month'. Next runs: Jan 31 12:00 AM, Feb 28 12:00 AM (29 in leap year), Mar 31 12:00 AM... Month-end tasks.
Examples
Common cron expressions with explanations.
Every minute
* * * * *
Explanation: Every minute
Next runs: 9:00, 9:01, 9:02, 9:03...
All fields = *. Runs continuously. Use for: intensive monitoring, testing. Caution: high CPU usage.
Every hour (on the hour)
0 * * * *
Explanation: At minute 0 (every hour)
Next runs: 9:00, 10:00, 11:00...
second minute hour day month weekday. Second: 0-59. Example: 30 0 9 * * * = 9:00:30 AM. Supported by: Quartz, Spring, some cloud schedulers. Standard cron: 5 fields (no seconds).
Special characters
* (any): matches all values. , (list): 1,15 = 1st and 15th. - (range): 1-5 = 1 through 5. / (step): */15 = every 15. ? (any, used in day/weekday): when other specified. L (last): last day/weekday. # (nth): 1#3 = 3rd Monday.
Asterisk (*)
Matches any value. Example: * in minute = every minute (0-59). * in weekday = every day (Sun-Sat). 0 * * * * = every hour (on the hour). * * * * * = every minute.
Step values (/)
*/n = every n units. */15 in minute = every 15 minutes (0, 15, 30, 45). */2 in hour = every 2 hours (0, 2, 4, 6...). Can use range: 0-30/5 = every 5 minutes from 0-30.
Ranges (-)
n-m = from n to m (inclusive). 1-5 in weekday = Mon-Fri. 9-17 in hour = 9 AM - 5 PM. 1-15 in day = first half of month. Example: 0 9-17 * * 1-5 = 9 AM - 5 PM, weekdays.
Lists (,)
n,m,o = specific values. 1,15 in day = 1st and 15th. 0,12 in hour = midnight and noon. MON,WED,FRI in weekday. Example: 0 9 1,15 * * = 9 AM on 1st and 15th of month.
Last day (L)
L in day = last day of month (28-31, varies). L in weekday = last occurrence (5L = last Friday). Example: 0 0 L * * = midnight on last day of month. 0 0 * * 5L = midnight on last Friday.
Nth weekday (#)
n#m = mth occurrence of weekday n. 1#3 = 3rd Monday (weekday 1, 3rd occurrence). 5#2 = 2nd Friday. Example: 0 9 * * 1#3 = 9 AM on 3rd Monday of month. Not all systems support.
Timezone handling
Cron runs in server timezone (usually UTC). Local time 9 AM in EST = UTC 2 PM (EST = UTC-5). Cron 0 14 * * * (UTC) = 9 AM EST. Check server timezone (date, timedatectl). Or use TZ= prefix (if supported).
Common mistakes to avoid
Using 7 for Sunday (should be 0 or 7, 0 preferred)
Why it happens: Weekday: 0-6 (Sun=0, Sat=6). Some systems accept 7=Sunday, but 0 standard. 0 9 * * 7 may fail on strict parsers. Confusing (0 and 7 both Sunday?).
How to avoid it: Use 0 for Sunday (standard). Or use names: SUN, MON, TUE... (clearer). Cron: 0 9 * * 0 or 0 9 * * SUN (Sunday 9 AM). Avoid 7.
Forgetting server timezone (cron runs UTC, not local time)
Why it happens: Cron runs in server timezone (usually UTC). Local 9 AM EST = 2 PM UTC. Cron 0 9 * * * (UTC) = 4 AM EST (UTC-5), not 9 AM EST. Job runs wrong time.
How to avoid it: Check server timezone: date, timedatectl. Convert local time to server timezone. Example: want 9 AM EST on UTC server → cron 0 14 * * * (9 AM + 5 hours = 2 PM UTC). Or use TZ= prefix (if supported).
Using day and weekday together (usually conflicts)
Why it happens: Day (1-31) and weekday (0-6) = OR logic (not AND). Cron 0 9 15 * 1 = 9 AM on 15th OR Monday (not 15th AND Monday). Runs more often than expected.
How to avoid it: Use day OR weekday, not both. If need 'specific weekday of month': use # (1#3 = 3rd Monday). Or leave other field as * (0 9 15 * * = 15th only, 0 9 * * 1 = Monday only).
Expecting 0 0 31 * * to run monthly (skips months without 31 days)
Why it happens: 0 0 31 * * = midnight on day 31. Feb (28/29 days), Apr/Jun/Sep/Nov (30 days) skipped. Runs 7 times/year (Jan, Mar, May, Jul, Aug, Oct, Dec), not 12.
How to avoid it: For monthly: use day 1-28 (guaranteed every month). Or use L (last day): 0 0 L * * (works all months). For 'every month': 0 0 1 * * (1st of month).
Not testing with next run calculator (schedule wrong)
Why it happens: Cron 0 9 * * 1-5 looks right (weekdays 9 AM). But next runs show: runs Mon-Fri (correct). Without testing: deploy → discover it runs weekends (syntax error: used 1-7 instead of 1-5, 7=Sunday).
How to avoid it: Use next run calculator before deploying. Verify: runs when expected, correct days/times, no skipped executions. Test edge cases (month boundaries, DST changes).
Frequently asked questions
What is the difference between 0 0 * * * and * * * * *?
0 0 * * * = At midnight (12:00 AM) every day. * * * * * = Every minute (all day, every day). First has minute=0, hour=0 (specific time). Second has all * (every value).
How do I run a cron job every 15 minutes?
*/15 * * * *. Step value */15 in minute field. Runs at: 0, 15, 30, 45 minutes past every hour. Example: 9:00, 9:15, 9:30, 9:45, 10:00, 10:15...
How do I run on the last day of the month?
0 0 L * *. L in day field = last day (28, 29, 30, or 31 depending on month). Example: Jan 31, Feb 28 (29 in leap year), Mar 31. Handles varying month lengths.
What does ? mean in cron?
? = any (used in day or weekday when the other is specified). Avoid conflict: 0 9 15 * ? = 9 AM on 15th (weekday = any). 0 9 ? * 1 = 9 AM on Monday (day = any). Not all systems support.
Standard cron = 5 fields (minute onwards, no seconds). */30 in minute = every 30 minutes, not seconds. For seconds: use 6-field cron (if supported): */30 * * * * * (every 30 seconds). Or script with sleep.
How do I run every 2 hours between 9 AM - 5 PM?
0 9-17/2 * * *. Range 9-17 (9 AM - 5 PM), step /2 (every 2 hours). Runs at: 9 AM, 11 AM, 1 PM, 3 PM, 5 PM. Combines range and step.