Skip to content

Cron Every 30 Minutes

Every 30 minutes is */30 in the minute field: on the hour and the half hour, 48 times a day.

minute · hour · day · month · weekday

Build it with controlsEvery 30 min
Every … minutes
Between

The last hour counts in full: the last run each day is at 11:30 PM.

On

In plain English

Every 30 minutes.

Tap a field to see what it means.

A week336 runs
Mon48Tue48Wed48Thu48Fri48Sat48Sun48
Next run
—
Usually every
—
Time zone
Yours
Convert to another schedulerQuartz, Spring, AWS, GitHub Actions, Kubernetes
The same schedule in every dialect
Standard cron*/30 * * * *current
Quartz0 0/30 * * * ?
Spring0 */30 * * * *
AWS EventBridgecron(0/30 * * * ? *)
GitHub Actions*/30 * * * *
Kubernetes*/30 * * * *
About Standard cronTime zone, day numbering, daylight saving
  • Runs in the machine’s local time zone; cronie also reads CRON_TZ at the top of the crontab.
  • Five fields, then the command. Day of week is 0–7 (0 and 7 are Sunday) or SUN–SAT; months 1–12 or JAN–DEC.
  • When both day fields are set, a day that matches either one runs.
  • Daylight saving: a job at a fixed time in a skipped hour runs right after the change, and one in a repeated hour runs once. Jobs with * in the minute or hour follow the clock.

Sources: crontab(5), cronie, cron(8), cronie, POSIX crontab.

How this works: Method, 10 sources,

How this works

Method

The expression is read field by field with the rules of the scheduler you pick (ranges, lists, steps, names, @ macros, and L, W and # where it has them) into the values each field allows. The next runs come from stepping forward through the calendar in the chosen time zone, day by day and then time by time, using that scheduler’s rule for when both day fields are set and its documented rule for daylight saving (where it has none, a skipped time is skipped and a repeated one runs once). A conversion to another scheduler is parsed back and checked against the original before it is shown.

Changes

  • First version: plain English and the next runs for six schedulers, a builder, conversion between them, and 20 pages for common schedules.

How we make toolsReport a mistake

Worked example: */30 * * * *

Say the clock reads Monday 4 January 2027, 10:41 AM UTC. */30 * * * * means “every 30 minutes”, so the next five runs are Monday 4 January 2027, 11:00 AM, 11:30 AM, 12:00 PM, 12:30 PM and 1:00 PM.

In UTC, where no clock change interrupts it, that comes to 48 runs a day, 336 a week and 17,520 in 2027.

Twice an hour

*/30 matches minutes 0 and 30, so the job runs on the hour and on the half hour, 48 times a day. It is the same as writing 0,30.

Any two minutes 30 apart give the same rhythm: 15,45 runs at quarter past and quarter to. Picking minutes other than :00 and :30 keeps your job away from the busiest moments on shared systems.

Half-hourly jobs are common for syncs and reports that should feel fresh without running constantly. If the job only matters in the daytime, narrow the hour field as well, for example */30 7-22 * * *.

Pitfalls

  • GitHub’s docs single out the start of every hour as a high-load time when scheduled workflows can be delayed or dropped; 15,45 * * * * avoids :00.
  • 30 * * * * is not every 30 minutes: it is once an hour, at half past.
  • Fall back: on the night clocks go back, Linux cron runs a */30 job in both copies of the repeated hour, so you get two extra runs.
  • GitHub: high-load times include the start of every hour, and to decrease the chance of delay you should schedule your workflow for a different time of the hour. Source: GitHub Actions: schedule.
  • cronie’s special handling of clock changes covers jobs at a specific time or less often than hourly; “jobs that run more frequently are scheduled normally”, so they follow the clock through a repeated hour. Source: cron(8), cronie.

“Every 30 Minutes” in every scheduler

The same schedule written for each scheduler, converted and checked by this tool. A dash means that scheduler can’t express it in one expression; the note says why.

The same schedule written for each scheduler, converted and checked by this tool. A dash means that scheduler can’t express it in one expression; the note says why.
SchedulerExpressionNote
Standard Unix cron (Vixie cron, cronie)*/30 * * * *
Quartz Scheduler (Java)0 0/30 * * * ?
Spring Framework @Scheduled0 */30 * * * *
Amazon EventBridge cron()cron(0/30 * * * ? *)
GitHub Actions schedule*/30 * * * *
Kubernetes CronJob*/30 * * * *

Frequently Asked Questions

Is */30 the same as 0,30?

Yes: minutes 0 and 30. Either way the job runs at :00 and :30.

How do I run every 30 minutes but not on the hour?

List two minutes 30 apart, such as 15,45 * * * * (quarter past and quarter to) or 10,40.

What does every 30 minutes look like in Kubernetes?

The same as Linux cron: schedule: "*/30 * * * *". Set .spec.timeZone if it should follow a zone other than the controller manager’s.