Minuteform / Every day at a set time
$ crontab -e
Cron every day at a specific time
A daily cron job is five fields with a fixed minute and hour and stars for the rest. The schedule is easy; the details are in the time zone the scheduler uses, the daylight-saving hour, and jobs missed while a machine was off.
Daily at a set time is M H * * *: minute first, then hour. Midnight is 0 0 * * *, 9 AM is 0 9 * * *, 2:30 AM is 30 2 * * *. Whose midnight depends on the scheduler’s time zone, so preview it in the zone your server uses.
01Common daily times
Each expression links to a preview of its next runs. Hours use the 24-hour clock.
| Expression | Runs | Note |
|---|---|---|
0 0 * * * | Every day at 00:00 | Same as @daily and @midnight in cronie and Kubernetes; GitHub Actions does not accept nicknames. |
0 9 * * * | Every day at 09:00 | |
0 12 * * * | Every day at 12:00 | |
0 18 * * * | Every day at 18:00 | 6 PM |
30 2 * * * | Every day at 02:30 | Inside the daylight-saving hour in many zones; see below. |
0 9,21 * * * | Twice a day, 09:00 and 21:00 | A list in the hour field. |
0 9 * * 1-5 | 09:00 Monday to Friday | Day of week 1–5. |
0 10 * * 6,0 | 10:00 Saturday and Sunday | Sunday is 0 or 7. |
0 9 */2 * * | 09:00 on the 1st, 3rd, 5th … of each month | Not strictly every other day: after the 31st comes the 1st, two days in a row. |
02The most common mistake: a star in the minute field
* 9 * * * does not mean “once at 9”. The star matches every minute, so the job runs 60 times, from 09:00 to 09:59. Put the minute first: 0 9 * * *. Minuteform’s plain-English line shows the difference straight away: compare it.
03Whose midnight? Time zones by scheduler
| Scheduler | Time zone used | Midnight in New York |
|---|---|---|
| crontab (Vixie, Debian, Ubuntu) | The system time zone (check with timedatectl or date) | 0 0 * * * on a server set to America/New_York |
| cronie (Fedora, RHEL) | System time zone, or CRON_TZ=America/New_York above the line | CRON_TZ=America/New_York then 0 0 * * * |
| GitHub Actions | UTC unless you add timezone: with an IANA name | cron: '0 0 * * *' with timezone: "America/New_York" |
| Kubernetes CronJob | The controller’s zone unless timeZone: is set | schedule: "0 0 * * *", timeZone: "America/New_York" |
Without a zone setting, a UTC schedule moves against local time twice a year. 0 13 * * * in UTC is 09:00 in New York in summer and 08:00 in winter. Preview midnight in New York.
04Daily jobs and daylight saving
In zones that change clocks, one local hour is skipped in spring and one is repeated in autumn, usually between 01:00 and 03:00. A daily job in that hour can be skipped or run twice, and cron implementations do not all agree on what happens.
For example, 02:30 did not exist in New York on 8 March 2026. Minuteform’s preview of 30 2 * * * therefore goes from 7 March to 9 March. If a daily job must run exactly once, schedule it outside 01:00–03:59 local time or run the scheduler in UTC. The cron and daylight saving page lists every change in 2026–2027 for 28 zones.
05If the job did not run
- The machine was off or asleep. cron does not catch up on missed times. On laptops and desktops use anacron for daily jobs, or a systemd timer with
Persistent=true, which runs a missed job at the next boot. - The server zone is not the one you expected. Compare
dateon the server with the zone in the preview. - The command fails only under cron. cron runs with a short environment, so use absolute paths, set variables in the crontab or script, and escape
%as\%. Send output to a log:0 2 * * * /path/to/job.sh >> /var/log/job.log 2>&1. - GitHub Actions: scheduled workflows run only on the default branch and can start late when GitHub is busy.
FAQQuestions people ask
What is the cron expression for every day at midnight?
0 0 * * *: minute 0, hour 0, every day. cronie and Kubernetes also accept @daily or @midnight; GitHub Actions does not, so use the five fields there.
How do I run a cron job at 9 AM every day?
Use 0 9 * * *. For 9 PM use 0 21 * * *, and for both use 0 9,21 * * *. The time is in the scheduler’s time zone, not necessarily yours.
Why does * 9 * * * run 60 times?
The first field is the minute. A star there matches every minute of the 9 o’clock hour, from 09:00 to 09:59. Use 0 9 * * * for a single run.
Does cron run a daily job that was missed while the computer was off?
No. cron only runs jobs whose time matches while it is running. anacron, or a systemd timer with Persistent=true, runs a missed daily job when the machine is next on.
How do I run a daily job only on weekdays?
Set the day-of-week field: 0 9 * * 1-5 runs at 09:00 Monday to Friday. Leave day of month as *; if both day fields are restricted, standard cron runs when either one matches. Read about that rule.
REFSources
Platform syntax follows the official documentation linked below. Vendors update their docs, so follow the links for the current wording.
- crontab(5) on man7.org: steps,
%in commands,CRON_TZ, the day-of-month OR day-of-week rule and daylight saving - GitHub Actions: schedule event: 5-minute minimum, delays and dropped runs under load, UTC default and
timezone, no@daily - Kubernetes CronJob:
schedule,timeZoneandconcurrencyPolicy - systemd.time(7) calendar events and systemd.timer(5)
Persistent= - anacron(8)