How to read a cron expression
A standard cron expression has five fields separated by spaces. A job runs when the current time matches all of the fields (with one exception for the two day fields, explained below).
┌───────── minute (0–59)
│ ┌─────── hour (0–23)
│ │ ┌───── day of month (1–31)
│ │ │ ┌─── month (1–12 or JAN–DEC)
│ │ │ │ ┌─ day of week (0–7 or SUN–SAT, 0 and 7 are Sunday)
│ │ │ │ │
* * * * *
* | every value |
|---|---|
5 | exactly 5 |
1,15 | a list: 1 and 15 |
9-17 | a range: 9 through 17 inclusive |
*/10 | a step: every 10th value starting at the minimum (0, 10, 20…) |
10-40/10 | a step within a range: 10, 20, 30, 40 |
How to use this tool
- Paste an expression from your crontab, Kubernetes CronJob, GitHub Actions workflow or CI config, or pick a preset.
- Read the plain-English summary and the field-by-field breakdown. Errors name the field and value that is wrong.
- Check the next 10 run times. Switch between local time and UTC, because most servers, GitHub Actions and Kubernetes evaluate cron in UTC by default.
Examples
0 9 * * 1-5 | At 09:00, Monday through Friday |
|---|---|
*/5 * * * * | Every 5 minutes |
0 0 1 * * | At midnight on the first day of every month |
30 4 * * 0 | At 04:30 every Sunday |
0 22 * * 1-5 | At 22:00 on weekdays, a typical nightly build |
@daily | Shortcut for 0 0 * * * (also @hourly, @weekly, @monthly, @yearly) |
The day-of-month / day-of-week trap
When both day fields are restricted, classic cron (Vixie cron, used by most Linux distributions) runs the job when either matches. So 0 0 13 * 5 runs on every 13th of the month and on every Friday, not only on Friday the 13th. This tool follows that rule and warns you when it applies.
Platform differences
- Quartz and Spring use six or seven fields, with seconds first and an optional year, plus special characters such as
?,L,Wand#. This tool explains the standard five-field format. - GitHub Actions schedules use five-field cron in UTC, and runs may be delayed during busy periods. The shortest interval is every 5 minutes.
- Kubernetes CronJobs use five-field cron. Since Kubernetes 1.27 you can set
timeZonein the spec; otherwise the controller's time zone applies.
Frequently asked questions
Why did my cron job not run at the time I expected?
The most common reason is time zones: the server or platform probably evaluates cron in UTC. Switch the run preview to UTC to compare. Other causes are the day-of-month/day-of-week OR rule and the job's environment (cron runs with a minimal PATH).
How do I run a job every 30 seconds?
Standard cron cannot go below one minute. Common workarounds are two entries where one sleeps 30 seconds first, or a systemd timer, which supports seconds.
Is 0 or 7 Sunday?
Both. In standard cron 0 and 7 mean Sunday, and 1 is Monday. You can also use names like SUN, MON or FRI.
What does */15 mean in the hour field?
Every 15th hour starting from 0, which is 00:00 and 15:00 only. Steps restart at the start of the range, so they do not "carry over" across days.
Does this support @reboot?
@reboot runs once when the cron daemon starts, so it has no next run time. The tool recognizes it and explains that.
Related tools
Last updated: