Regex and cron

Cron Expression Generator and Explainer

Build or paste a cron expression, read it in plain English, see exactly when it runs in your time zone, and copy a ready-made snippet for your scheduler.

  • 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.

Five fields: minute, hour, day of month, month, day of week. Add a sixth at the front for seconds. Macros like @daily work too.
ClearCopy a link to this scheduleCopy expression
Minute: at minute 0 (on the hour)Hour: at hour 9 (9 AM)Day of month: every day of the monthMonth: every monthDay of week: Monday through Friday
Time zone
Next runs, the week view and the snippets use this zone. It starts as your device's zone.
Adds a 6th field at the front for seconds (Quartz, Spring, node-cron, systemd). Standard crontab, GitHub Actions and Kubernetes can't run it.
Show times as 9:00 AM instead of 09:00.
DoneValid 5-field cron expression · 1 run on each day it matches

Build it field by field

Choose a field, then how it should match. The expression above updates as you click, and typing in the expression updates these controls.
Minute of the hour (0–59).Hour of the day, 24-hour clock (0–23).Day of the month (1–31). Combines with the weekday field using cron's either-day rule.Month of the year (1–12, or Jan–Dec).Day of the week (0–6 from Sunday; 7 is also Sunday).
Run on every minute (*).Pick exact values, e.g. 0 and 30. Written as a comma list.Every value between two bounds, inclusive, e.g. 9-17.Every Nth minute, e.g. */5. Steps restart at each boundary.

Minute: at minute 0 (on the hour)

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
0 9 * * 1-5  /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

A cron expression is five fields separated by spaces (minute, hour, day of month, month and day of week) that tell a scheduler when to run a job. For example, 0 9 * * 1-5 means 09:00 every Monday to Friday. Playxoft's free Cron Expression Generator builds expressions field by field, explains them in plain English, lists the next runs in any time zone and writes matching config for crontab, GitHub Actions, Kubernetes and other schedulers.

  • Plain-English explanation
  • Field-by-field builder
  • Next runs in any time zone
  • Daylight saving aware
  • Seven platform snippets
  • Shareable links
  • Seconds field

How to use the Cron Expression Generator

  1. 1Type or paste an expression into Cron expression, or start from a preset such as Every 5 minutes or Weekdays at 9am.
  2. 2Click a field and use Build it field by field to choose Every, Specific values, a Range or a Step. The expression updates as you click.
  3. 3Read the plain-English sentence, then check Next runs in your time zone. Runs moved by daylight saving time are flagged.
  4. 4Turn on Seconds field if your scheduler uses a sixth field for seconds, such as Spring, Quartz or node-cron.
  5. 5Open Use it on your platform, pick crontab, GitHub Actions, Kubernetes, Cloudflare, Vercel, AWS or systemd, and copy the snippet.
  6. 6Use the link button to share the exact schedule and time zone with your team.

What is the cron expression format?

Cron is the Unix job scheduler, and a cron expression is the schedule part of a crontab line: five fields separated by spaces. A job runs whenever the current time matches every field.

┌───────────── minute        0–59
│ ┌─────────── hour          0–23
│ │ ┌───────── day of month  1–31
│ │ │ ┌─────── month         1–12 or JAN–DEC
│ │ │ │ ┌───── day of week   0–7 or SUN–SAT (0 and 7 are Sunday)
│ │ │ │ │
0 9 * * 1-5   /path/to/command
FieldAllowed valuesExampleMeaning
Minute0–5930At half past
Hour0–23 (24-hour clock)9-1709:00 through 17:00
Day of month1–311,15The 1st and the 15th
Month1–12, JAN–DEC*/3January, April, July, October
Day of week0–7, SUN–SAT1-5Monday to Friday

Many schedulers also accept macros: @hourly (0 * * * *), @daily or @midnight (0 0 * * *), @weekly (0 0 * * 0), @monthly (0 0 1 * *), @yearly or @annually (0 0 1 1 *), and @reboot, which runs once when the cron daemon starts. GitHub Actions is one scheduler that rejects macros, so write the five fields there.

Spring and Quartz use six fields with seconds first, and Quartz also needs ? in one day field (0 0 9 ? * MON-FRI). node-cron accepts an optional seconds field. Browse ready-made schedules in the cron schedule library, and check the syntax your platform documents: crontab(5) for Linux, or the guides linked in the time zone table below.

What do *, /, - and , mean in cron?

Four characters do almost all the work. They combine freely, so 0,30 9-17/2 * * * is valid.

CharacterNameExampleMatches
*Any value* in hourEvery hour
,List0,30 in minute:00 and :30
-Range (inclusive)1-5 in day of weekMonday to Friday
/Step*/15 in minute:00, :15, :30, :45

A step counts from the start of its range: */15 starts at 0, 5-59/15 gives :05, :20, :35 and :50. Steps restart at every boundary, so */7 in the minute field runs at :56 and then again at :00, only four minutes later.

Put a step after * or a range, never after a single number. 0/15 means "every 15 minutes from 0" in Quartz, Spring, Kubernetes and EventBridge, but Vixie cron and cronie (Linux crontab) reject it. */15 or 0-59/15 works everywhere.

Some schedulers add characters standard cron does not have: L (last day), W (nearest weekday), # (nth weekday) and ? (no specific value). Quartz, Spring and AWS EventBridge accept all four. Cloudflare Workers accepts L, W and # but not ?, and Kubernetes treats ? like *. Linux crontab and GitHub Actions accept none of them. Watch the weekday numbers in #: Quartz, EventBridge and Cloudflare count Sunday as 1, so the second Monday is 2#2. The last day of the month and first Monday of the month pages show the portable workarounds.

How do day of month and day of week combine?

This is cron's most surprising rule. When both day fields are restricted, cron runs when either one matches, not both. So 0 0 1 * 1 runs at midnight on the 1st of every month and on every Monday.

That is why 0 0 1-7 * 1 does not mean "the first Monday of the month": it runs on days 1 to 7 and on every Monday. The reliable fix is to schedule days 1–7 and test the weekday in the command (escape % inside crontab), as the first Monday of the month page explains:

0 9 1-7 * *  [ "$(date +\%u)" = 1 ] && /path/to/first-monday.sh

There is one more twist in Vixie cron and cronie: a day field that starts with * counts as unrestricted, even */2. So 0 0 */2 * 1 runs only on odd-numbered days that are also Mondays. Other implementations disagree on this edge case, so this tool follows cronie (what most Linux servers run) and warns you when it applies.

How do time zones and daylight saving time affect cron jobs?

A cron expression has no time zone of its own. It runs in whatever zone the scheduler uses, and several popular platforms default to UTC or only support UTC:

PlatformTime zoneDaylight saving
Linux crontabServer's zone; CRON_TZ= per crontab in cronieFollows local clock changes (see below)
GitHub ActionsUTC by default; add timezone: (IANA name) next to each cron entryFollows the named zone; a run in the skipped hour moves to the next valid time
Kubernetes CronJobspec.timeZone (any IANA name, 1.27+), else the controller's zoneFollows the named zone
Cloudflare WorkersUTC onlyNone
Vercel Cron JobsUTC onlyNone
AWS EventBridge SchedulerAny IANA zoneFollows the named zone
AWS EventBridge scheduled rules (legacy)UTC onlyNone
systemd timersServer's zone, or a zone written after the time in OnCalendar=Follows the named zone

In a zone with daylight saving time, one night a year skips an hour and another repeats one. Cronie handles both: a job at a fixed time inside the skipped hour (say 30 2 * * * in New York) runs once, right after the clocks jump; in the repeated hour it runs only once. Jobs with * in the minute or hour field follow the wall clock instead, so they lose the skipped runs and repeat the doubled hour. The Next runs list in the generator shows these cases for any zone you pick. The safest habit: run servers in UTC, and avoid scheduling local jobs between 01:00 and 04:00, the window where the US, Western Europe and Eastern Europe change their clocks.

What are the most common cron mistakes?

  1. Every minute by accident. * * * * * runs 1,440 times a day. Hourly is 0 * * * *.
  2. Steps in the wrong field. */2 * * * * is every 2 minutes; every 2 hours is 0 */2 * * *.
  3. Assuming the server's time zone. Most cloud servers and CI runners use UTC, so 0 9 * * * may fire at 4 or 5 in the morning New York time.
  4. A step after a single number. 0/15 works in Quartz and Kubernetes, but Linux crontab rejects it; write */15.
  5. Unescaped `%`. In a crontab line, % ends the command and starts its input. Write date +\%F.
  6. A different environment. Cron runs with a minimal PATH and no shell profile. Use absolute paths and set variables at the top of the crontab.
  7. Overlapping runs. Cron starts the next run even if the last one is still going. Use flock -n /tmp/job.lock command.
  8. Silent failures. Output is mailed to the crontab owner and often lost. Redirect it to a log and alert when a job stops checking in.

Cron vs systemd timers vs cloud schedulers: which should I use?

All three read similar schedules; they differ in what happens around the run.

cronsystemd timersCloud schedulers
Best forSimple jobs on one Linux machineServer jobs that need logs and catch-upServerless apps, CI, Kubernetes
Missed runs while downSkippedRun at boot with Persistent=trueDepends on the provider
LogsMail, or your own redirectjournald: journalctl -u jobProvider console
SecondsNoYesUsually no (1-minute minimum)
Time zonesServer zone (CRON_TZ in cronie)Any zone in OnCalendar=UTC on Cloudflare and Vercel; GitHub Actions, Kubernetes and EventBridge Scheduler accept a zone
Overlap controlDo it yourself with flockWon't start a unit that is still runningconcurrencyPolicy in Kubernetes

Use cron for quick jobs on a box you manage, systemd timers when reliability and logging matter on that box, and your platform's scheduler when the job lives in the cloud. Whichever you pick, this generator writes the syntax for you.

Frequently asked questions

Five asterisks match every minute of every hour of every day, so the job runs once a minute, 1,440 times a day. It is the most frequent schedule standard cron allows.
Use */5 * * * *. The */5 step in the minute field matches minutes 0, 5, 10 and so on through 55, so the job runs 12 times an hour, aligned to the clock.
Both. Standard cron accepts 0 and 7 for Sunday, and 1 to 6 for Monday to Saturday. Names such as SUN and MON also work. AWS EventBridge, Quartz and Cloudflare Workers are different: they number days 1 to 7 starting with Sunday, so a copied 1-5 runs Sunday to Thursday there. Use names like MON-FRI when moving expressions between them.
Cron uses the time zone of the machine or service running it. Linux crontab follows the server's zone, Kubernetes uses the CronJob's timeZone field, GitHub Actions defaults to UTC but accepts a timezone field next to each cron entry, and Cloudflare Workers, Vercel and EventBridge scheduled rules always use UTC.
Not directly: standard cron's smallest unit is one minute. Add a second crontab line that sleeps 30 seconds before running the job, use a systemd timer, or use a scheduler with a seconds field: Spring and node-cron accept */30 * * * * *, and Quartz needs */30 * * * * ? because one day field must be a question mark.
Usually because both day fields are set. When day of month and day of week are both restricted, cron runs when either matches, so 0 0 1 * 1 runs on the 1st and on every Monday. The other common cause is a scheduler running in UTC.
No. Parsing, explanations, run times and snippets are all computed in your browser. Nothing you type is uploaded or stored, and the tool keeps working offline once the page has loaded.

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

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

SQL to Prisma Converter

Turn SQL DDL into a schema.prisma with native types, relations and enums.

Open tool