DevToolsForYou
Utilities

Cron Expression Examples

A reference guide to cron syntax with common schedule patterns — from every minute to complex multi-field expressions — with plain-English explanations.

3 min readUpdated Apr 11, 2026

Cron field order

A standard cron expression has five space-separated fields. From left to right: minute (0–59), hour (0–23), day of month (1–31), month (1–12), day of week (0–7, where both 0 and 7 are Sunday). An asterisk (*) means 'every valid value for this field'.

text
┌───── minute        (0–59)
│ ┌───── hour          (0–23)
│ │ ┌───── day of month  (1–31)
│ │ │ ┌───── month         (1–12)
│ │ │ │ ┌───── day of week   (0–7, Sun=0 or 7)
│ │ │ │ │
* * * * *

Common schedule patterns

The table below shows the most frequently used cron expressions. Copy any of them directly into your crontab, GitHub Actions schedule, or cloud scheduler.

text
# Every minute
* * * * *

# Every 5 minutes
*/5 * * * *

# Every 15 minutes
*/15 * * * *

# Every hour (at the top of the hour)
0 * * * *

# Every day at midnight UTC
0 0 * * *

# Every day at 9 AM UTC
0 9 * * *

# Every weekday (Mon–Fri) at 8 AM UTC
0 8 * * 1-5

# Every Monday at 6 AM UTC
0 6 * * 1

# First day of every month at midnight
0 0 1 * *

# Every quarter (Jan, Apr, Jul, Oct) on the 1st at midnight
0 0 1 1,4,7,10 *

# Every Sunday at 2 AM UTC (common for weekly backups)
0 2 * * 0

Special syntax: step values

The /n syntax means 'every n units'. Combined with a range, you can express schedules like 'every 10 minutes between 8 AM and 6 PM'.

text
# Every 10 minutes
*/10 * * * *

# Every 10 minutes between 8 AM and 6 PM
*/10 8-18 * * *

# Every 2 hours
0 */2 * * *

# Every 6 hours
0 */6 * * *

Lists and ranges

Commas create lists; hyphens create ranges. You can combine them within a single field.

text
# At 8 AM and 6 PM every day
0 8,18 * * *

# Weekdays (Mon through Fri)
0 0 * * 1-5

# At 9 AM on Mon, Wed, and Fri
0 9 * * 1,3,5

# Every minute during the 9 AM and 2 PM hours
* 9,14 * * *

Non-standard extensions (@reboot, @daily, etc.)

Many cron implementations support shorthand nicknames. These are not part of the POSIX spec and may not work in all environments — check your platform's documentation.

text
@reboot    # Run once at system startup
@yearly    # 0 0 1 1 *  — once a year
@annually  # same as @yearly
@monthly   # 0 0 1 * *  — once a month
@weekly    # 0 0 * * 0  — once a week
@daily     # 0 0 * * *  — once a day
@midnight  # same as @daily
@hourly    # 0 * * * *  — once an hour

GitHub Actions cron schedules

GitHub Actions uses the standard five-field syntax in the on.schedule trigger. All times are UTC. The minimum supported interval is every 5 minutes, and schedules may be delayed by up to 30 minutes during high load.

yaml
on:
  schedule:
    # Run every day at 3:30 AM UTC
    - cron: "30 3 * * *"
    # Also run every Monday at 9 AM UTC
    - cron: "0 9 * * 1"
Frequently asked questions

What timezone does cron use?

By default, cron runs in the system timezone of the server, which is often UTC on cloud machines. Always check — and consider making UTC explicit — to avoid surprises around daylight saving time transitions.

Why does my cron job not run at the expected time?

Common causes: the server timezone is not what you assumed, the minimum interval is 1 minute so sub-minute schedules are not possible, or the job was skipped because the previous run was still active. Check your platform's logs first.

Can cron run a job every 30 seconds?

Standard cron cannot — the smallest unit is 1 minute. To run every 30 seconds, schedule the job every minute and have the script sleep 30 seconds and then run again, or use a purpose-built scheduler with sub-minute precision.

Related cheatsheetsAll cheatsheets →
Related guidesAll guides →