A cron expression is a string of five (or six) fields that defines a recurring schedule. Originally created for the Unix cron daemon in the 1970s, this compact syntax has become the universal standard for scheduling recurring tasks. You will encounter cron expressions in Linux crontabs, CI/CD pipelines, cloud schedulers (AWS CloudWatch, Google Cloud Scheduler, Azure Functions), Kubernetes CronJobs, GitHub Actions, Cloudflare Workers Cron Triggers, and task runners across every platform. Each field represents a time unit: minute hour day-of-month month day-of-week.
| Field | Allowed Values | Special Characters |
|---|---|---|
| Minute | 0 to 59 | * , - / |
| Hour | 0 to 23 | * , - / |
| Day of Month | 1 to 31 | * , - / |
| Month | 1 to 12 | * , - / |
| Day of Week | 0 to 7 (0 and 7 = Sun) | * , - / |
* matches every value in the field. , separates a list of values (e.g., 1,3,5 means the 1st, 3rd, and 5th). - defines a range (e.g., 1-5 means Monday through Friday). / defines a step interval (e.g., */5 in the minute field means every 5 minutes, and 10/15 means "starting at minute 10, then every 15 minutes").
* * * * * runs every minute. Useful for health checks and queue workers, but be careful with resource-heavy tasks.
*/5 * * * * runs every 5 minutes. A good default for polling tasks, cache refreshes, and lightweight data syncing.
0 * * * * runs at the top of every hour. Common for hourly reports, log rotation, and aggregation jobs.
0 0 * * * runs at midnight every day. The standard for daily backups, cleanup scripts, and report generation.
0 9 * * 1-5 runs at 9 AM on weekdays. Perfect for business-hours notifications, daily standups, and scheduled emails.
0 0 1 * * runs at midnight on the first day of every month. Used for billing, monthly reports, and certificate renewal checks.
Timezone confusion: Cron expressions run in the timezone of the server or service executing them. A job scheduled for 0 9 * * * runs at 9 AM in whatever timezone the cron daemon is configured for. Always check which timezone your scheduler uses, and be aware that UTC-based schedulers will not follow daylight saving changes.
Day-of-month vs day-of-week: When both fields are set to specific values (not *), most cron implementations treat them as OR conditions, not AND. This means 0 0 15 * 1 runs on the 15th of every month AND every Monday, not only on Mondays that fall on the 15th.
Overlapping runs: If a job takes longer than the interval between runs, you can end up with multiple instances running simultaneously. Use a lock file, a distributed lock (like Redis SETNX), or your scheduler's built-in concurrency controls to prevent this.
Standard Unix cron uses 5 fields. Quartz Scheduler (used in Java applications and Spring) adds a seconds field at the beginning, making it 6 fields. AWS CloudWatch also uses 6 fields but includes a year field. GitHub Actions uses standard 5-field syntax in the schedule trigger. Always check the documentation for your specific platform, since field ordering and special character support can vary.
Scheduling API calls? Check out the API Request Tester to build and test your requests first. Working with timestamps in your scheduled jobs? The Unix Timestamp Converter helps you work with epoch time. For a look at free APIs you can build scheduled integrations with, see 30+ Free APIs for Developers in 2026.
This tool runs 100% client-side. No data is sent to any server. Your cron expressions never leave your browser.