Regex and cron

Cron Expression for Every 30 Minutes

On the hour and at half past (:00 and :30), every hour of every day. Copy it, check the next runs in your time zone and grab a snippet for your platform.

  • Free foreverNo trial, no paywall, no usage limits.
  • No sign-upOpen the page and start. We never ask for an email to use a tool.
  • PrivateEverything runs in your browser. Your input is never uploaded or stored on our servers.
  • Works offlineOnce the page has loaded, the tool keeps working without a connection.

Cron expression

*/30 * * * *
Customize
*/30minuteMinute: every 30 minutes: :00 and :30*hourHour: every hour*day (month)Day of month: every day of the month*monthMonth: every month*day (week)Day of week: every day of the week

On the hour and at half past (:00 and :30), every hour of every day.

Time zone
Run times, the week view and the snippets use this zone. It starts as your device's zone.
Show times as 9:00 AM instead of 09:00.

Next runs

Each run in your selected time zone, with the same moment in UTC. Daylight saving changes follow cronie, the cron on most Linux servers.
Copy run times (ISO 8601)

Next 7 days

Each square is one hour of local time in your selected zone. Darker squares have more runs. Daylight saving changes are not drawn.

Use it on your platform

Copy-ready config for each scheduler. Dialects differ: some only run in UTC, some can't do seconds, Cloudflare and AWS number weekdays from 1 = Sunday. The snippet handles the conversion and says what changed.
A line for crontab -e on Linux or macOS (Vixie cron, cronie).on.schedule for a workflow, with the timezone field GitHub added in March 2026 (UTC when omitted).A CronJob manifest with the timeZone field (Kubernetes 1.27+).Cron Triggers in wrangler.toml for a Worker. Runs in UTC and numbers weekdays from 1 = Sunday.crons in vercel.json plus the route it calls. Runs in UTC.EventBridge Scheduler (any time zone, recommended by AWS) and a legacy EventBridge scheduled rule (UTC).A .timer unit with OnCalendar=, the systemd replacement for cron.
Runs as writtenRuns in your time zone
crontab -e
Copy crontab -eDownload my-job.crontab
# ┌───────────── minute (0–59)
# │ ┌─────────── hour (0–23)
# │ │ ┌───────── day of month (1–31)
# │ │ │ ┌─────── month (1–12)
# │ │ │ │ ┌───── day of week (0–6, Sunday = 0)
# │ │ │ │ │
# * * * * *  command
CRON_TZ=UTC
*/30 * * * *  /path/to/my-job.sh >> /var/log/my-job.log 2>&1
  • CRON_TZ=UTC is honored by cronie (Fedora, RHEL, Arch). Other cron daemons ignore it and use the server's time zone, so check timedatectl first.
  • Edit with crontab -e. Cron starts the next run even if the last one is still going; wrap the command in flock -n /tmp/my-job.lock to prevent overlaps.

Need scheduled jobs, queues and monitoring that never miss a run? Talk to our team

Quick answer

The cron expression for every 30 minutes is */30 * * * *. The */30 step in the minute field matches minutes 0 and 30, so the job runs on the hour and at half past: twice an hour, 48 times a day. Writing 0,30 * * * * gives exactly the same schedule, and 15,45 * * * * keeps the rhythm but moves it off the hour.

  • Live next runs
  • Any time zone
  • Field-by-field breakdown
  • Seven platform snippets
  • Daylight saving aware

How to use this schedule

  1. 1Copy */30 * * * * with the Copy expression button.
  2. 2Check Next runs in your time zone to confirm it fires when you expect, including around daylight saving changes.
  3. 3Pick your platform under Use it on your platform and copy the ready-made crontab line, workflow, manifest or timer.
  4. 4Need a different time or day? Click Customize to open it in the cron expression generator and change any field.

What does */30 * * * * mean?

*/30 keeps every thirtieth minute starting at 0, and the minute range only has room for two: 0 and 30. With so few values, the list form 0,30 is arguably clearer, and it makes the half-hour offset obvious too: 15,45 or 10,40 keep the 30-minute spacing without firing on the hour.

Three look-alikes catch people out, so it is worth comparing them side by side:

ExpressionWhat it does
*/30 * * * *:00 and :30 of every hour
0,30 * * * *The same, written as a list
30 * * * *Once an hour, at :30 only
*/30 * * * * *Every 30 seconds (6-field syntax)

The last one is the 6-field format used by Spring and node-cron, where the first field is seconds (Quartz writes it with ? in a day field). See every 30 seconds for that schedule.

When does a 30-minute schedule make sense?

Half-hourly suits data that changes steadily but not urgently: syncing a product catalog, refreshing an internal dashboard, collecting files dropped on an SFTP server, or pulling metrics from a provider that only updates a few times an hour. At 48 runs a day it is gentle on rate-limited APIs.

A neat property: because the rhythm is every half hour, it stays aligned with the local clock even in zones with half-hour offsets, such as India at UTC+05:30. A server on UTC running */30 * * * * still fires on the hour and at half past in Mumbai.

The interval only works this cleanly because 30 divides 60. Steps that don't, such as */40, restart every hour and give uneven gaps (:00, :40, then :00 again 20 minutes later). For a true 40- or 90-minute interval you need several lines or a scheduler with fixed intervals. If you want fewer runs instead, every hour is the next step up.

What does each field in */30 * * * * mean?

FieldValueAllowedMeaning
Minute*/300–59every 30 minutes: :00 and :30
Hour*0–23every hour
Day of month*1–31every day of the month
Month*1–12, JAN–DECevery month
Day of week*0–7 (0 and 7 are Sunday), SUN–SATevery day of the week

Read together: On the hour and at half past (:00 and :30), every hour of every day.

How do I adjust */30 * * * * to my own schedule?

Small edits to */30 * * * * cover most real-world needs:

ExpressionWhat it does
0,30 * * * *The same schedule written as a list
15,45 * * * *Every 30 minutes at quarter past and quarter to
*/30 8-18 * * *Every 30 minutes from 08:00 to 18:30
*/30 * * * 1-5Every 30 minutes on weekdays only
0 * * * *Every hour, on the hour

Need something else? Click Customize at the top of the page to open this schedule in the cron expression generator and change any field.

Related schedules: Every 15 minutes · Every hour · Every 30 seconds · Every 10 minutes

Browse all schedules in the cron schedule library.

How do I run */30 * * * * in crontab, GitHub Actions, Kubernetes and the cloud?

PlatformWrite it asTime zone
Linux crontab*/30 * * * *Server's time zone; CRON_TZ= in cronie
GitHub Actions- cron: "*/30 * * * *"UTC by default; add timezone: (IANA name)
Kubernetes CronJobschedule: "*/30 * * * *"Set timeZone: (1.27+)
Cloudflare Workers*/30 * * * *UTC only; numbers weekdays from 1 = Sunday, so use names
Vercel Cron Jobs*/30 * * * *UTC only; more than once a day needs Pro (Hobby: once a day)
AWS EventBridge Schedulercron(*/30 * * * ? *)Takes a time zone; legacy scheduled rules are UTC only
systemd timerOnCalendar=*-*-* *:00,30:00Add a zone after the time, e.g. Europe/London

In a crontab (crontab -e), the full line looks like this:

*/30 * * * *  /path/to/job.sh >> /var/log/job.log 2>&1

The live panel at the top of the page builds complete, copy-ready files for each platform (workflow, CronJob manifest, wrangler.toml, vercel.json, AWS CLI and systemd units) and can shift the schedule to UTC for platforms that need it.

What can go wrong with */30 * * * *?

  • 30 * * * * (no slash) is a common slip: it runs once an hour at :30, not every 30 minutes.
  • Don't mix up the 5-field */30 * * * * with the 6-field */30 * * * * * used by Spring and node-cron, which runs every 30 seconds. Count the fields before you deploy.
  • Steps don't carry over the hour, so */40 * * * * isn't every 40 minutes: it runs at :00 and :40, leaving a 20-minute gap. 30 works because it divides 60 evenly.
  • Long exports or backups scheduled every half hour can overlap themselves on slow days. Use flock -n /tmp/job.lock your-command.
  • In a zone with daylight saving time, a schedule with * in the minute or hour field follows the wall clock: the spring-forward night loses an hour of runs and the fall-back night repeats one. Servers on UTC never see this.

Frequently asked questions

Yes. Both run at minute 0 and minute 30 of every hour, 48 times a day.
Use a list with your own minutes, for example 15,45 * * * * or 10,40 * * * *. Any two minutes 30 apart keep the half-hour rhythm.
The expression is probably 30 * * * *, which means minute 30 of every hour. Add the step: */30 * * * * runs at :00 and :30.
Not with a single expression, because steps restart every hour and every day. Two lines do it: 0 0-21/3 * * * and 30 1-22/3 * * * together fire every 90 minutes, 16 times a day.

Last updated by the Playxoft engineering team.

From the engineers who built this tool

Need scheduled jobs that never miss a run?

Cron is the easy part. Retries, overlapping runs, time zones, queues and alerts when a job silently stops are where schedules break. We build background job systems you can trust, and we will review your setup for free.

More free tools

See all tools

Regex Tester

Test regex live with highlighted matches, plain-English explanations and code export.

Open tool

Cron Expression Generator

New

Build and explain cron schedules, see the next runs in any time zone, copy platform snippets.

Open tool

SQL Formatter

Beautify or minify SQL in 12 dialects, with keyword case, indent and line:column errors.

Open tool

cURL to Python Converter

New

Convert cURL commands into Python requests or httpx code with params, json, files and auth.

Open tool

cURL to Fetch Converter

New

Turn any cURL command into JavaScript fetch() code with headers, JSON, forms and auth.

Open tool

cURL to Axios Converter

New

Convert cURL commands into an Axios request config with params, data, auth and timeouts.

Open tool