Cron Expression Parser
Turn a cron expression into a plain-English description and list its next run times, or build one by choosing a schedule such as every day or every week. A mistake is reported with the field that caused it.
Five fields separated by spaces, in this order: minute, hour, day of month, month, day of week.
Examples
How to use
- Type a cron expression into the field. Choosing a schedule such as every day or every week under "Build an expression from a schedule", or pressing one of the "Examples" buttons, also fills the field
- The meaning appears as a sentence, followed by what each field selects and the next 5 run times
- Choose whether run times are calculated in "This device's time" or "UTC". Match the time zone the job actually runs in
- Press "Copy expression" to copy the expression in the field, without the spaces around it. The button is unavailable while the expression cannot be read
The result updates as you type. When the expression has a mistake, the message names the field and the part that caused it.
Example
Entering */15 9-17 * * 1-5 shows the following.
- Meaning: Runs every 15 minutes, during hours 9–17 on Monday–Friday.
- Minute
*/15: 0, 15, 30, 45 - Hour
9-17: 9–17 - Day of month
*: any - Month
*: any - Day of week
1-5: Monday–Friday
Because the hour field is 9-17, the last run is at 17:45. To stop at 17:00 exactly, split it into two lines: */15 9-16 * * 1-5 and 0 17 * * 1-5.
Building an expression from a schedule
Choose how often the job runs under "Build an expression from a schedule". Only the settings that schedule needs appear below it, and the finished expression is written to the field. The expression changes each time you change a setting. With the initial values, the expressions are as follows.
- Every few minutes: set the interval in minutes, from 1 to 59. 5 gives
*/5 * * * *. 1 gives* * * * * - Every hour: set the minute to run at. 0 gives
0 * * * * - Every few hours: set the interval in hours, from 2 to 23, and the minute to run at, from 0 to 59. Every 2 hours at minute 0 gives
0 */2 * * * - Every day: set the time. 9:00 gives
0 9 * * * - Every week: set the days of the week and the time. Monday at 9:00 gives
0 9 * * 1 - Every month: set the day and the time. The 1st at 9:00 gives
0 9 1 * * - Every year: set the month, the day and the time. January 1 at 9:00 gives
0 9 1 1 *
You can select several days of the week. They are written in ascending order with Sunday as 0 and Saturday as 6, and three or more days in a row become a range. Monday to Friday is 1-5, Monday, Wednesday and Friday is 1,3,5, and Saturday and Sunday is 0,6. Selecting all seven days gives *.
- For a minute interval that does not divide 60 (such as 7) or an hour interval that does not divide 24 (such as 5), a note says that the runs are not evenly spaced
- For days 29 to 31 in a monthly schedule, a note says that months without that day are skipped. For a yearly date such as February 30, the run times section says that the expression never runs
- When a setting is empty or outside its range, a message names the setting, and the expression in the field is not changed
- The choices are only written to the field. Editing the field or pressing an "Examples" button clears the selected schedule. An expression in the field is never read back into the settings
- Only the seven schedules above can be built. For a combination such as "every 15 minutes, 9–17 on weekdays", build something close and then edit the field
- The time has no time zone. Enter it in the time zone the job runs in
Syntax rules
A cron expression is five fields separated by spaces, written in this order.
- Minute: 0–59
- Hour: 0–23
- Day of month: 1–31
- Month: 1–12, or
JAN–DEC - Day of week: 0–7 (both 0 and 7 are Sunday), or
SUN–SAT
Each field accepts these forms.
*: every value5: that value only1-5: the range from 1 to 51,15: 1 and 15 (a comma-separated list)*/10: every 10th value from the minimum (for minutes: 0, 10, 20, 30, 40, 50)10-30/5: every 5th value from 10 to 30 (10, 15, 20, 25, 30)
Month and weekday names are read in upper or lower case.
These shortcuts are also accepted.
@hourly:0 * * * *(minute 0 of every hour)@daily,@midnight:0 0 * * *(midnight every day)@weekly:0 0 * * 0(midnight every Sunday)@monthly:0 0 1 * *(midnight on the 1st of every month)@yearly,@annually:0 0 1 1 *(midnight on January 1)
When both day fields are set
When the day-of-month and day-of-week fields are both something other than *, cron runs on days that match either one, not only on days that match both.
0 0 1 * 1: runs on the 1st of every month and on every Monday (not "only when the 1st is a Monday")0 0 13 * 5: runs on the 13th of every month and on every Friday. It does not mean "Friday the 13th" only
The exception is a field that begins with *, such as */2: then the day must match both fields. 0 0 */2 * 1 runs only on Mondays that fall on an odd day. This follows the cron implementations most widely used on Linux (Vixie cron and cronie).
FAQ
Does */7 run every 7 minutes?
No. */7 means "every 7th value from 0", so it runs at minutes 0, 7, 14, … 56. After 56 comes minute 0 of the next hour, which leaves a 4-minute gap. The step restarts every hour, so a number that does not divide 60 never gives an even interval. The same applies to */5 in the hour field: after 0, 5, 10, 15 and 20 comes 0:00 the next day.
Which time zone are the run times calculated in?
"This device's time" uses the time zone set on your device, and "UTC" uses UTC.
A cron expression carries no time zone of its own, so choose the one the job actually runs in. Unless something says otherwise, cron uses the server's time zone. A crontab that sets CRON_TZ=Asia/Tokyo, for example, runs in that zone instead of the server's. schedule in GitHub Actions uses UTC by default.
When the job's time zone is neither your device's nor UTC, this tool cannot show its run times.
How is daylight saving time handled?
With "This device's time", the hours around a clock change are handled as follows.
- When a time occurs twice at the end of daylight saving time: an expression whose minute or hour field begins with
*(such as* * * * *or*/10 * * * *) is listed both times. An expression with a fixed time, such as30 1 * * *, is listed for the first occurrence only - A time the clock skips when daylight saving time begins (for example, a day on which 2:30 does not exist): left out of the list
An expression whose every match falls on a skipped time (such as 30 2 8-14 3 */7 in New York) has no run time to list, and the tool says so.
The handling at the end of daylight saving time follows cronie. At the start, cronie runs a skipped fixed-time job right after the change, which this tool does not reproduce. Cron implementations differ here, so where daylight saving time applies and precision matters, running the job in UTC is the reliable choice. When your device's time zone observes daylight saving time, a note appears below the run times.
Are expressions with six or more fields, such as seconds or a year, supported?
No. Only the five fields of standard crontab are supported. The seconds field of Quartz and Spring, the year field of AWS EventBridge, and the extended symbols ?, L, W and # are not read, and entering them shows an error.
Can I put a step on a single value, like 5/15?
That is reported as an error. Some cron implementations read 5/15 as "every 15th value from 5", but Vixie cron and cronie, the ones most widely used on Linux, do not accept it. Write it as a range, 5-59/15, which means the same everywhere. The error message shows the rewritten form.
Can I make a cron expression without writing it by hand?
Under "Build an expression from a schedule", choose every few minutes, every hour, every few hours, every day, every week, every month or every year. The expression is written to the field, and its meaning and run times appear right away. "Copy expression" copies the expression in the field. The command to run is not included, so add it after the expression when you put the line in a crontab.
Can I paste a line straight from my crontab?
A line that includes the command to run, such as 0 5 * * * /usr/bin/backup.sh, cannot be read. Enter only the first five fields.
Can a range wrap past midnight, like 22-5?
No. A range that starts above its end is an error in most cron implementations, so this tool reports it as an error too. For 22:00 through 5:00 the next morning, write 22-23,0-5.
What happens with a date that does not exist, such as February 30?
An expression such as 0 0 30 2 * is valid syntax, so its meaning is shown, but the run times section says that it never runs. 0 0 31 * * runs only in months that have a 31st, and 0 0 29 2 * runs only in leap years.
Is @reboot supported?
@reboot runs a job once when cron starts and has no date or time, so this tool cannot calculate anything for it.
Is the expression I enter saved anywhere?
No. Everything is processed in your browser, nothing is sent anywhere, and the expression disappears when you reload the page.
- Type
- Utility
- Category
- Developer
- Tags
- cron
- crontab
- generator
- schedule
- time
- developer
Related apps

UUID & ULID Generator
Generate UUID v4, time-ordered UUID v7, and ULIDs in bulk. Create up to 100 values with one click, switch UUIDs to uppercase, hyphen-less, or brace-wrapped output, and copy them. Paste a UUID or ULID to see its version and creation time and to rewrite it between ULID and UUID notation.

Calendar Event Creator (ICS File & Add-to-Google-Calendar Link)
Create an .ics file for Apple Calendar, Outlook and Google Calendar, plus add-to-calendar links for Google and Outlook. Supports all-day events, repeats (weekdays, nth weekday, count, end date), reminders and time zones.

Meta Tag & OGP Generator (Title, Description, X Card)
Generate the title, description, canonical, Open Graph and X (Twitter) card tags for your page head. Preview Google results and social cards, and check text length, relative image URLs and image size.


