Skip to content

Runs entirely in your browser. Nothing you paste leaves this page.

Free / No sign-up

Cron expression explainer and validator.

Paste a cron schedule to read it in plain English, validate every field and see exactly when it runs next, in your own time zone.

At 09:00 on Monday through Friday

  1. 0

    Minute

    0-59

  2. 9

    Hour

    0-23

  3. *

    Day of month

    1-31

  4. *

    Month

    1-12 or JAN-DEC

  5. 1-5

    Day of week

    0-7 or SUN-SAT

Next 5 runs

Calculating...

Syntax

*
every value
5,10
a list of values
1-5
a range
*/15
every 15th value
9-17/2
every 2nd in a range
MON, JAN
names for days and months

Standard 5-field cron, as used by Linux crontab, Kubernetes CronJobs and GitHub Actions. Run times are shown in your time zone; many schedulers, GitHub Actions included, run in UTC by default. Seconds and year fields are not supported.

How to use it.

  1. 01

    Type an expression or pick an example such as weekdays at 9:00.

  2. 02

    Read the plain-English description and the five fields it is made of.

  3. 03

    Check the next five run times before you deploy the schedule.

What it does.

Everything this tool handles, all of it inside your browser tab.

  • Plain-English description that updates as you type
  • Validates every field against its allowed range
  • Specific error messages, such as a backwards range or a wrong field count
  • Breakdown of the five fields with their allowed values
  • Next five run times in your time zone, with the zone shown
  • Month and weekday names (JAN-DEC, SUN-SAT)
  • @yearly, @annually, @monthly, @weekly, @daily, @midnight and @hourly
  • Detects schedules that never fire, such as February 30th
  • One-click example schedules and copy button

Worked examples.

  • Cron every 5 minutes

    */5 * * * *
    
    > Every 5 minutes
    Runs at :00, :05, :10 ... :55 of every hour

    Swap 5 for 10, 15 or 30 to change the interval. Values that divide evenly into 60 give a perfectly regular schedule.

  • Cron every day at midnight

    0 0 * * *
    
    > At 00:00
    Same as @daily and @midnight

    Midnight in the scheduler's time zone, which on many hosted platforms is UTC.

  • Cron every weekday at 9 am

    0 9 * * 1-5
    
    > At 09:00 on Monday through Friday
    Also valid: 0 9 * * MON-FRI

    Day of week 1-5 is Monday to Friday. Names such as MON and FRI are accepted and are easier to read.

  • Every 15 minutes during business hours

    */15 9-17 * * 1-5
    
    > Every 15 minutes past hour 9 through 17 on Monday through Friday
    First run 09:00, last run 17:45

    The hour range includes 17, so the job keeps running until 17:45. Use 9-16 to stop at 16:45.

  • Every 2 hours, and the day OR rule

    0 */2 * * *
    > At minute 0 past every 2 hours
    
    0 0 1 * 1
    > At 00:00 on day 1 of the month or on Monday

    The second schedule fires on the 1st and on every Monday, because both day fields are restricted.

How to read a cron expression

A standard cron expression has five fields separated by spaces: minute (0-59), hour (0-23), day of month (1-31), month (1-12 or JAN-DEC) and day of week (0-7 or SUN-SAT, where both 0 and 7 mean Sunday). A job runs whenever the current minute matches all of them, subject to the day rule below.

Each field accepts * for every value, lists such as 1,15, ranges such as 1-5, and steps such as */15 or 9-17/2. The macros @yearly (or @annually), @monthly, @weekly, @daily (or @midnight) and @hourly are shorthands for common schedules.

This explainer follows the Vixie cron rules used by Linux crontab. It checks every field against its allowed range, explains the schedule in plain English, breaks it into its five fields and calculates the next five run times in your browser's time zone. If a schedule can never fire, it says so.

Field order is the most common mix-up: minute comes first, not hour. 9 0 * * * runs at 00:09, not at 9:00. Reading the plain-English line before you deploy catches this straight away.

What does */5 mean in cron?

A step means "every nth value within the range". */5 in the minute field is shorthand for 0-59/5, so it fires at minutes 0, 5, 10 and so on up to 55. It is anchored to the clock, not to when you saved the crontab: a job created at 10:03 first runs at 10:05.

Steps restart at every boundary. */7 in the minute field fires at 0, 7, 14 up to 56, then at 0 again, so the gap across the hour is only 4 minutes. If you need an exact interval that does not divide evenly into 60 minutes or 24 hours, cron cannot express it; use a timer-based scheduler instead.

Steps also work on ranges: 9-17/2 in the hour field means 9, 11, 13, 15 and 17.

The day-of-month and day-of-week trap

When both day fields are restricted, standard cron runs on days that match either one, not both. 0 0 1 * 1 runs at midnight on the 1st of every month and also on every Monday, not only on Mondays that fall on the 1st. The explainer spells this out with an "or".

In Vixie cron, and in this tool, a day field that starts with * (such as */2) counts as unrestricted for this rule. To run on "the first Monday of the month", standard cron needs help: schedule 0 9 1-7 * * and have the job itself exit unless today is a Monday, or use a scheduler that supports the Quartz # syntax.

Cron vs Quartz, Spring and AWS EventBridge syntax

Not every "cron" is the same format. Linux crontab, Kubernetes CronJobs and GitHub Actions use the five standard fields this tool explains.

Quartz (common in Java schedulers) uses six or seven fields: seconds first, then the standard five, then an optional year. It requires ? in one of the two day fields, numbers days of the week 1-7 starting on Sunday, and adds L (last), W (nearest weekday) and # (nth weekday, as in 6#3 for the third Friday). Spring's @Scheduled cron also starts with a seconds field. AWS EventBridge uses six fields ending in a year, also with ? in one day field.

Pasting a six-field Quartz or Spring expression here gives "Expected 5 fields but found 6". Drop the leading seconds field (and any trailing year), and replace ? with *, to get the standard equivalent where one exists.

Time zones and daylight saving

Cron itself has no idea of time zones; it uses whatever zone the scheduler runs in. A Linux crontab follows the server's system time zone, and some implementations accept a CRON_TZ variable. Kubernetes CronJobs use the controller's time zone unless you set the spec.timeZone field. GitHub Actions evaluates schedules in UTC by default and accepts an optional IANA timezone next to each cron entry. It also limits schedules to at most once every 5 minutes, and runs can start late when the platform is busy.

The next-run list on this page uses your browser's time zone, shown above it. If your scheduler runs in UTC, convert before you trust the times; the Unix timestamp converter helps.

Daylight-saving changes skip or repeat an hour in many regions, and implementations differ in how they handle jobs scheduled inside it. For critical jobs, schedule in UTC or avoid the local changeover hours.

Why a cron job does not run: common mistakes

The expression is often fine and the environment is not. Cron runs commands with a minimal PATH and no login shell, so use absolute paths to binaries and files. In a crontab line, an unescaped % is turned into a newline, so date +%F must be written date +\%F. Redirect output to a log file, otherwise errors vanish or go to local mail.

Within the expression itself, look for six fields copied from Quartz, a Quartz-only character such as ? or L, a range written backwards such as 5-1 (cron does not wrap ranges), or a date that does not exist, such as 0 0 30 2 *. This tool flags each of these.

Also guard against overlapping runs: if a job can take longer than its interval, wrap it in a lock (for example flock on Linux) or use a scheduler with a concurrency policy. In pipelines, scheduled jobs are a common part of CI/CD; our GitHub Actions CI/CD guide shows schedules alongside build workflows.

Questions, answered

Something else on your mind? Ask a consultant and get a reply within one business day.

Which cron syntax does this support?

Standard 5-field cron as used by Linux crontab, Kubernetes CronJobs and GitHub Actions, including names, ranges, lists, steps and the common @ macros. Quartz-style 6 or 7 field expressions with seconds are not supported.

What does * * * * * mean?

Every minute of every hour of every day. Each * means "every value" for its field, so the job runs 1,440 times a day.

How do I run a cron job every 5 minutes?

Use */5 * * * *. It runs at minutes 0, 5, 10 and so on, aligned to the clock rather than to when the job was created.

Is Sunday 0 or 7 in cron?

Both. Standard cron accepts 0 and 7 for Sunday, and SUN works too. Quartz is different: it numbers days 1-7 starting with Sunday.

Can cron run every 30 seconds?

Not on its own: the smallest unit in standard cron is one minute. Common workarounds are two entries where one sleeps 30 seconds first, or a timer-based scheduler such as a systemd timer.

Which time zone are the next runs in?

Your browser's time zone, shown above the list. Many schedulers evaluate cron in UTC by default, GitHub Actions included, so convert before relying on the times.

Why does my schedule never run?

Some combinations are impossible, such as 0 0 30 2 * (February 30th). The tool looks eight years ahead and tells you when a schedule never fires.

Why does */7 not run exactly every 7 minutes?

Steps restart at each hour, so */7 fires at minutes 0, 7 ... 56 and then 0 again, leaving a 4-minute gap. Only intervals that divide evenly into 60 are perfectly regular.

What is the difference between cron and crontab?

Cron is the background service that runs scheduled jobs. A crontab is the table of schedules and commands it reads, edited with crontab -e.

Does it support @reboot?

No. @reboot runs once when the cron service starts rather than on a time schedule, so there are no run times to calculate.

Is the expression sent anywhere?

No. Parsing and run-time calculation happen in this tab with a small parser written for the page.

More free tools.

All tools

Need tooling like this inside your product?

We build internal tools, developer platforms and APIs. Tell us what your team keeps doing by hand.