Crontab to English Converter
Convert cron expressions to human-readable English. Parse crontab syntax, validate schedules, and see next run times instantly.
About
A mistyped cron expression can trigger a job every minute instead of every month. That single character error compounds: runaway processes, duplicated emails, overwhelmed databases, inflated cloud bills. The five-field crontab format (minute hour day-of-month month day-of-week) packs dense scheduling logic into terse syntax where */5 and 5 mean fundamentally different things. This converter parses each field against POSIX cron semantics, validates ranges (minute 0 - 59, hour 0 - 23, day 1 - 31, month 1 - 12, weekday 0 - 7), and produces unambiguous English. It also calculates the next 5 execution times so you can verify the schedule before deployment.
The tool handles lists, ranges, step values, month and weekday names (JAN - DEC, SUN - SAT), and common shorthand macros like @daily or @weekly. Limitation: it assumes the system timezone matches your local browser timezone. It does not model non-standard extensions like seconds fields or year fields found in Quartz or Spring schedulers.
Formulas
A standard POSIX cron expression consists of 5 whitespace-separated fields:
Each field accepts the following token types:
n → exact value
a-b → range from a to b inclusive
x/s → starting at x, every s steps
a,b,c → list of specific values
Valid ranges per field:
hour ∈ [0, 23]
day-of-month ∈ [1, 31]
month ∈ [1, 12]
day-of-week ∈ [0, 7] where 0 = 7 = Sunday
The parser first checks for macro aliases (@daily, @weekly, etc.) and expands them. Then each field is split by comma to produce a list of atoms. Each atom is classified as wildcard, range, step, or literal. Step values expand to an enumerated set: for */15 in the minute field, the set becomes {0, 15, 30, 45}. The English description is assembled by translating each field's set into natural language and combining them.
Reference Data
| Cron Expression | Meaning | Use Case |
|---|---|---|
| * * * * * | Every minute | Health check ping |
| 0 * * * * | Every hour at minute 0 | Hourly log rotation |
| 0 0 * * * | Daily at midnight | Database backup |
| 0 6 * * 1-5 | Weekdays at 06:00 | Morning report email |
| */15 * * * * | Every 15 minutes | Cache refresh |
| 0 0 1 * * | First day of every month at midnight | Monthly billing |
| 0 0 * * 0 | Every Sunday at midnight | Weekly cleanup |
| 30 4 1,15 * * | 1st and 15th at 04:30 | Bi-monthly payroll |
| 0 22 * * 1-5 | Weekdays at 22:00 | End-of-day ETL job |
| 0 0 1 1 * | January 1st at midnight | Annual license renewal |
| 0 */2 * * * | Every 2 hours | Monitoring alert digest |
| 5 4 * * 0 | Sundays at 04:05 | Weekly analytics export |
| 0 9-17 * * * | Every hour 09:00 - 17:00 | Business-hours polling |
| 0 0 */3 * * | Every 3 days at midnight | Staggered data sync |
| @reboot | Once at system startup | Service initialization |
| @hourly | Every hour (alias for 0 * * * *) | Quick shorthand |
| @daily | Once a day (alias for 0 0 * * *) | Nightly tasks |
| @weekly | Once a week (alias for 0 0 * * 0) | Weekly digest |
| @monthly | Once a month (alias for 0 0 1 * *) | Invoice generation |
| @annually | Once a year (alias for 0 0 1 1 *) | Certificate renewal |