Crontab Guru
Paste a cron expression and get a field-by-field explanation of what it does, in plain English. No need to remember the field order or look up the ranges: the guru walks through each of the five fields (minute, hour, day-of-month, month and day-of-week) and reads the expression left to right. Useful for checking a crontab line before you deploy it, or for explaining a line you inherited.
How to use the guru
-
1
Paste the expression
Copy any standard 5-field cron expression (for example `0 9 * * 1-5`) into the field.
-
2
Explain it
Click Explain Cron and the tool returns a line-by-line description of each field: minute, hour, day-of-month, month and day-of-week.
-
3
Read the description
The explanation is generated in English, for example "Minute: every 5 minutes" or "Hour: from 9 through 17."
-
4
Check before deploying
Use the explanation to confirm the schedule does what you want before you put it in your crontab, CI config or Kubernetes manifest.
Field cheat sheet
┌───────────── 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; Sun = 0 or 7)
│ │ │ │ │
* * * * *
Operators in cron expressions
| Operator | Meaning | Example |
|---|---|---|
* |
Every value | * * * * * |
, |
List of values | 0,15,30,45 |
- |
Range | 9-17 |
/ |
Step (start/step) | */5, 0-30/5 |
L |
Last (day-of-month or last weekday, Quartz) | L, 5L |
W |
Nearest weekday | 15W (Quartz) |
# |
Nth weekday of month | 1#3 (Quartz) |
? |
No specific value | Quartz only |
Reading order matters
0 */2 * * 1-5 reads left to right as: minute 0, every 2 hours, any day of month, any month, Monday through Friday. Humans sometimes read the fields right-to-left by habit and get confused, always start from minute.
The “every X minutes” trap
*/10 * * * * fires at minute 0, 10, 20, 30, 40, 50, not “every 10 minutes from whenever the job was created.” Cron steps always measure from the beginning of the field’s range. If you deploy a job at 12:03, the first run is at 12:10, not 12:13.
For jobs that truly need “N minutes after the last run,” use a scheduler with a persistent timer (systemd timers with OnUnitActiveSec, or application-level scheduling with a stored last-run timestamp).
Cron gotchas worth knowing
- Day-of-month + day-of-week both set: most cron implementations treat this as OR behaviour, probably not what you want.
- Step of 0:
*/0is invalid. - Range wraps around:
22-2for hours does not work in classic cron; use22-23,0-2. - February 30: a schedule like
0 0 30 2 *never fires. - DST ambiguity: jobs scheduled between 2 AM and 3 AM may fire twice or zero times on DST transition days.
Cron vs. modern schedulers
Unix cron is still everywhere, but for anything critical you probably want:
- systemd timers: catch missed runs, support randomised offsets, read from unit files.
- Kubernetes CronJob: declarative, retries, timezone-aware in 1.25+.
- Airflow / Prefect / Dagster: for jobs with dependencies, retries, backfills, observability.
- GitHub Actions schedule: 5-field cron, UTC only, minimum 5-minute interval, best-effort delivery.
Cron itself is a great format, but a poor scheduler for jobs that must not miss.
Frequently Asked Questions
Because day-of-week 0 is Sunday in standard cron (and 7 is also Sunday, supporting both conventions). Monday is 1. Quartz numbers weekdays 1-7 with Sunday = 1, which frequently trips people moving between dialects.
Classic Unix cron runs in the server’s local timezone, whatever /etc/timezone says. Kubernetes CronJob, GitHub Actions and most cloud schedulers run in UTC by default. Always confirm and, when possible, use UTC to avoid DST surprises.
Classic cron cannot express this directly. Workaround: run every Monday and check the date inside the script: [ $(date +%d) -le 7 ] && ./job.sh. Quartz supports it natively with 1#1.
No. Each schedule needs its own line. But you can combine several schedules into one line with lists: 0 9,17 * * * runs at 9 AM and 5 PM. For schedules that cannot be expressed as a single line, add multiple lines pointing to the same command.
Related Tools
ASCII Table Reference
Full ASCII table from 0 to 127 with decimal, hex, octal, binary, standard names and HTML numeric-reference notation, including NUL, LF and DEL.
HEX Color Picker
Pick or enter a HEX colour and get RGB, HSL, approximate CMYK, relative luminance and contrast ratios against white and black.
Color Palette Generator
Generate monochromatic, analogous, complementary, triadic or tetradic color palettes from a base HEX color and export copy-ready CSS variables.
HTML Character Reference
Searchable list of HTML entities, their named and numeric codes, and a one-click copy for special characters and symbols.
FPS Counter
Measure browser FPS with requestAnimationFrame, smoothing, min/max frame rate, warnings and an optional graph. Runs locally with no upload or API.
JSON Formatter
Paste JSON to pretty-print with 2 or 4 spaces, minify it to compact output, or run a quick syntax check before copying the result.