Quick answer
A cron expression has 5 space-separated fields: minute, hour, day of month, month and day of week. For example “0 9 * * 1-5” means 9:00 every Monday to Friday, and “*/15 * * * *” means every 15 minutes.
What is a cron expression?
Type a cron expression to read it in plain English, see how each field is interpreted and list the next 10 run times in the time zone you pick (Ho Chi Minh City, UTC, Tokyo, New York…). The tool understands Linux crontab (Vixie cron) syntax: *, commas, ranges like 1-5, steps like */10, month and weekday names (JAN, MON), macros such as @daily and @hourly, and the 6-field form with seconds first. The builder writes an expression for you without remembering the field order. Everything runs in your browser.

How to read and check a cron expression
- 1
Paste the expression into the “Cron expression” box, for example a line from crontab -e (just the first 5 fields, not the command).
- 2
Read the sentence and the field table to confirm the schedule. If the syntax is wrong, the error says which field is the problem.
- 3
Choose your server's time zone (servers often run on UTC) to see the next 10 runs exactly as the server will execute them.
- 4
To write a new schedule, use “Build an expression”: pick how often, the time and days, then press “Use this expression”.
The five crontab fields
| Position | Field | Values | Example |
|---|---|---|---|
| 1 | Minute | 0–59 | 30 = minute 30 |
| 2 | Hour | 0–23 | 14 = 2 pm |
| 3 | Day of month | 1–31 | 1 = the 1st |
| 4 | Month | 1–12 or JAN–DEC | */3 = every quarter (1, 4, 7, 10) |
| 5 | Day of week | 0–7 or SUN–SAT (0 and 7 are both Sunday) | 1-5 = Monday to Friday |
Swipe sideways to see the whole table →
Symbols: * any value · , list (1,15) · - range (9-17) · / step (*/10 means 0, 10, 20…).
Common cron expressions
| Expression | Meaning |
|---|---|
| * * * * * | Every minute |
| */5 * * * * | Every 5 minutes |
| 0 * * * * | At the start of every hour |
| 0 0 * * * | Midnight every day (same as @daily) |
| 30 2 * * * | 2:30 am every day, good for backups |
| 0 9 * * 1-5 | 9:00 on weekdays |
| 0 8 * * 1 | 8:00 every Monday |
| 0 0 1 * * | Midnight on the 1st of every month |
| 0 0 1 1 * | Midnight on 1 January (same as @yearly) |
Linux crontab vs Quartz vs GitHub Actions
| Aspect | Linux crontab | Quartz / Spring | GitHub Actions |
|---|---|---|---|
| Fields | 5 (minute → weekday) | 6–7 (seconds first, year last) | 5, like Linux |
| Day of week | 0–7, 0 and 7 are Sunday | 1–7, 1 is Sunday | 0–6, 0 is Sunday |
| Day and weekday both set | Runs when EITHER matches | One of them must be ? | Same as Linux |
| Extra syntax | @daily, @reboot… | L, W, # (last day, second Friday…) | No macros |
| Time zone | Server time (or CRON_TZ) | Application setting | Always UTC |
Swipe sideways to see the whole table →
GitHub Actions uses UTC: for 8:00 in Vietnam (UTC+7) write 0 1 * * *. Scheduled runs can be a few minutes late when GitHub is busy.
Real-world examples
Nightly backup at 2 am
0 2 * * * runs at 02:00 every day. On a server set to UTC that is 09:00 in Vietnam; pick UTC on the right to check before saving the job.
Weekly report
0 17 * * 5 runs at 17:00 every Friday. The list of next runs shows the coming Fridays straight away.
Both day and weekday set
0 0 13 * 5 is NOT “Friday the 13th”: it means “the 13th or any Friday”, because Linux cron combines the two fields with OR.
GitHub Actions workflow at 7:30 am Vietnam time
Convert to UTC: 7:30 − 7 hours = 0:30, so write schedule: cron: '30 0 * * *'. Pick UTC here to see the real run times.
Common mistakes
- The job runs hours off.
- The server or service (GitHub Actions, many cloud schedulers) uses UTC. Convert the time to UTC or set CRON_TZ at the top of the crontab if your cron supports it.
- * 9 * * * runs 60 times.
- A * in the minute field means every minute of hour 9. To run once at 9:00 write 0 9 * * *.
- L, W or # is rejected.
- That is Quartz / Spring syntax that Linux crontab does not understand. For “last day of the month” on Linux, run on days 28–31 and check in the command whether tomorrow is the 1st.
- Day 31 skips some months.
- Months without a 31st (April, June, September, November, February) are skipped; cron does not move the run to the last day.
Which time zone does cron use?
Cron uses the server's system time. Check it with timedatectl or date. Many VPS images default to UTC, so 0 9 * * * runs at 16:00 in Vietnam.
The run list in this tool uses the time zone you select. In zones with daylight saving time, wall times that do not exist on the change day are skipped.
Glossary
- Cron
- The scheduler built into Linux / Unix that runs commands at set times.
- Crontab
- Cron's schedule table; each line holds a time expression and a command. Edit it with crontab -e.
- Cron job
- One scheduled task, such as a nightly database backup.
- Step
- The /n syntax: */15 in the minute field means minutes 0, 15, 30 and 45.
- Macro
- A shorthand for a common schedule: @hourly, @daily, @weekly, @monthly, @yearly.
- UTC
- Coordinated Universal Time; Vietnam is UTC+7 all year with no daylight saving.
Frequently asked questions
Can cron run every second?
Linux crontab's smallest step is one minute. Some libraries (node-cron, Spring) add a seconds field at the front; this tool reads that 6-field form.
What is @reboot?
It runs the command once each time the server boots. There is no repeating schedule, so there are no next run times to show.
How do I list cron jobs on a server?
Run crontab -l for the current user and also look at /etc/crontab and /etc/cron.d. In aaPanel, jobs are under the Cron menu.
Does */7 in the minute field run every 7 minutes exactly?
Not quite: */7 means minutes 0, 7, 14… 56 and then 0 of the next hour, so the last gap of each hour is only 4 minutes.
My cron job runs but nothing happens. Where are the errors?
Cron mails the output or throws it away. Append >> /tmp/job.log 2>&1 to the command to log it, and use full paths (/usr/bin/php rather than php) because cron's PATH is very short.
Why does % break my crontab command?
In crontab, % means a newline, so a command such as date +%Y gets cut off. Escape it as \% or move the command into a script file.
Ratings and comments
Loading…