Xerobit

Cron Expression Builder

Build standard cron expressions (5 fields) with live human-readable explanation and the next 5 scheduled run times. Presets for the most common schedules.

minute
0-59
hour
0-23
day of month
1-31
month
1-12
day of week
0-6 (Sun=0)
Cron expression
* * * * *
every minute
Next 5 scheduled runs (local time)
Tuesday, October 27, 2026 at 11:00 PM
Tuesday, October 27, 2026 at 11:01 PM
Tuesday, October 27, 2026 at 11:02 PM
Tuesday, October 27, 2026 at 11:03 PM
Tuesday, October 27, 2026 at 11:04 PM
Edit any field or pick a preset.

Cron field reference

FieldRangeSpecial
Minute0-59* , - /
Hour0-23* , - /
Day of month1-31* , - /
Month1-12* , - /
Day of week0-6 (Sun=0)* , - /

Syntax cheatsheet

  • *: every value in the range
  • 5: exact value
  • 1-5: range (inclusive)
  • 1,3,5: list
  • */5: every 5 starting from 0
  • 0-30/10: every 10 from 0 to 30

The day-of-month / day-of-week gotcha

When both day-of-month and day-of-week are restricted (not *), POSIX cron matches if either is satisfied, they're OR'd, not AND'd. So 0 0 15 * 1 means "midnight on the 15th of every month OR every Monday," which is probably not what you intended. This tool uses the POSIX OR rule (consistent with cron, Jenkins, etc).

Cron pitfalls

  • Timezone: classic Linux cron runs in the server's local timezone. DST transitions can make a job run twice or skip a run. For safety, set the machine to UTC or use a scheduler that supports explicit timezones (systemd timers, Quartz).
  • Missed runs: if the machine is off at the scheduled time, the run is gone. Use anacron or a job runner with catch-up semantics.
  • Overlap: if your job takes longer than the interval, you'll end up with concurrent runs. Wrap in a lock file or use a scheduler that prevents overlap.
  • Seconds: standard cron doesn't have a seconds field. If you see a 6-field cron, it's a non-standard extension (Quartz, some JS libraries). This tool is 5-field POSIX.

Common cron schedules

ExpressionNicknameMeaning
0 * * * *@hourlyEvery hour at :00
0 0 * * *@dailyEvery day at midnight
0 0 * * 0@weeklyEvery Sunday at midnight
0 0 1 * *@monthlyFirst of every month at midnight
*/5 * * * *: Every 5 minutes
*/15 * * * *: Every 15 minutes
0 9-17 * * 1-5Business hoursTop of every hour, Mon-Fri 9 AM-5 PM
0 0 1 * *First of monthMidnight on the 1st of each month
0 8 * * 1-5Weekdays only8 AM every weekday
0 0 * * 0Sunday midnightWeekly cleanup run

Cron vs systemd timers vs cloud schedulers

Classic Linux cron isn't the only game in town. Here's how the major options compare:

SchedulerTimezone supportMissed-run handlingComplexity
Linux cronServer TZ onlySkipped silentlyLow
systemd timersAny TZ via OnCalendarCatch-up with Persistent=trueMedium
AWS EventBridgeUTC + rate/cron expressionsAt-least-once, retries configurableMedium
GCP Cloud SchedulerAny IANA TZConfigurable retry policyMedium
GitHub Actions scheduleUTC onlySkipped if repo inactive 60 daysLow

Platform-specific cron differences

The 5-field standard isn't universal. Know the quirks before you deploy:

  • GitHub Actions: uses standard 5-field POSIX cron in UTC. The ? wildcard (used in Quartz to mean "no specific value") is not supported: use * instead. Note that GitHub queues scheduled runs when runners are busy; actual run time can be 15-30 minutes late under load.
  • Kubernetes CronJob: standard 5-field cron. The startingDeadlineSeconds field controls how many seconds past the scheduled time a job can still be started, set it or missed jobs are silently dropped.
  • Quartz Scheduler (Java): 6-field: seconds, minutes, hours, day-of-month, month, day-of-week. The ? is required in either day-of-month or day-of-week to avoid ambiguity. So 0 30 9 ? * MON-FRI means 9:30 AM weekdays.
  • AWS EventBridge: supports both rate expressions (rate(5 minutes)) and cron expressions. EventBridge cron is 6-field (adds year), uses ? like Quartz, and runs in UTC. The format is cron(minutes hours day-of-month month day-of-week year).
  • Node.js / node-cron: optionally 6-field with seconds as the first field. Check your library docs, some default to 5-field, others to 6-field.

FAQ

Does this support 6-field (with seconds) expressions?

No, 5-field POSIX only. If you see 0 0 12 * * ?, that's Quartz format. Drop the first (seconds) field and replace ? with * to convert to standard cron: 0 12 * * *.

Does it support @daily / @hourly?

The tool uses equivalent numeric expressions. @hourly equals 0 * * * *, @daily equals 0 0 * * *, @weekly equals 0 0 * * 0, and @monthly equals 0 0 1 * *. Use the preset dropdown to jump straight to these.

How do I handle timezones in cron?

Classic cron has no timezone awareness, it runs in whatever TZ the server is set to. The safest approach is to run your server in UTC and do the timezone math yourself. If you need user-timezone-aware scheduling, switch to a scheduler that supports IANA timezone strings: systemd OnCalendar, GCP Cloud Scheduler, or a library like Quartz. This tool shows next run times in your browser's local timezone for reference.

How do I test a cron expression before deploying?

Use this tool's "next 5 run times" output to verify the schedule looks right. For a more exhaustive check, pipe the expression through croniter (Python) or node-cron's validate() method. For GitHub Actions, push to a test branch and watch the Actions tab, you can also trigger a scheduled workflow manually with workflow_dispatch to confirm the job works before the first real run.

Pillar

Reference pages