Cron Expression Generator
Build and validate cron expressions.
Visual editor, presets, natural language input, and next-run preview.
Visual builder
Presets
At 09:00 AM, only on Monday
- 2026-05-11 09:00:00 UTC
- 2026-05-18 09:00:00 UTC
- 2026-05-25 09:00:00 UTC
- 2026-06-01 09:00:00 UTC
- 2026-06-08 09:00:00 UTC
Code snippets
name: Scheduled workflow
on:
schedule:
- cron: '0 9 * * 1'
workflow_dispatch:
jobs:
scheduled:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run job
run: echo "Running scheduled job" - • Workflows scheduled at the top of the hour may be delayed during high-load periods. Consider scheduling 5 minutes past the hour (e.g. "5 * * * *") for more reliable timing.
- • Scheduled workflows run only on the default branch.
- • Public repos: workflow auto-disabled after 60 days of no activity.
- • workflow_dispatch added for manual testing — a common community pattern that lets you trigger the workflow manually without waiting for the next scheduled run.
Field reference
| Field | Allowed values |
|---|---|
| Minute | 0–59 |
| Hour | 0–23 |
| Day of month | 1–31 |
| Month | 1–12 |
| Day of week | 0–6 (Sun=0) |
* Every value , List (0,15,30) - Range (1-5) / Step (*/5) How to use
Build your expression
Use the visual builder, click a preset, or type an expression directly. You can also try natural language like "every monday at 9am."
Verify the schedule
Read the human description and check the next 5 run times in your timezone. Change the timezone selector to see run times in different regions.
Copy a code snippet
Switch between GitHub Actions, Kubernetes, Vercel, and crontab tabs to get the platform-specific snippet. Click to copy.
Understanding cron expressions
A cron expression is a string of five fields that define when a scheduled task should run.
Reading left to right: minute (0–59), hour (0–23), day of month (1–31), month (1–12), and
day of week (0–6, where 0 is Sunday). The asterisk means "every" — so * * * * * runs every minute, and 0 9 * * 1 runs at 9:00 AM every
Monday.
The special characters extend the basic notation significantly. The slash (
/) creates step values: */15 in the minute field means
every 15 minutes. The comma (
,) creates lists: 1,15 in the day-of-month field
means "on the 1st and 15th." The hyphen (
-) creates ranges: 1-5 in the day-of-week field
means Monday through Friday.
Every major platform uses the same five-field format, but timezone handling and constraints
differ significantly. GitHub Actions defaults to UTC and supports a timezone field
with any IANA timezone name; schedules shorter than 5 minutes are silently ignored, and
adding workflow_dispatch alongside schedule is a common pattern that
allows triggering the workflow manually. Kubernetes CronJobs pick up the
kube-controller-manager local timezone by default; since Kubernetes 1.27 the
timeZone field (camelCase) is stable — and unlike crontab, embedding
CRON_TZ in the schedule string causes a validation error. Vercel Cron
always runs in UTC with no timezone field; Hobby plan cron jobs may run at most once per
day, and failed invocations are never retried, so handlers should be idempotent. Traditional
crontab uses the system timezone and can be overridden with a CRON_TZ= directive
(vixie-cron / cronie) or the TZ environment variable. The code snippet section
above generates platform-ready configuration, including timezone fields, for each
environment.