A Golang job scheduling library that lets you run Go functions at pre-determined intervals using cron expressions, fixed durations, daily, weekly, monthly, or one-time schedules with support for distributed deployments.
How to choose between duration, cron, and time-based schedules for your jobs.
gocron provides three main scheduling strategies:
Each has different strengths and use cases.
func DurationJob(duration time.Duration) JobDefinitionRuns every duration:
j, _ := s.NewJob(
gocron.DurationJob(5*time.Minute),
gocron.NewTask(myFunc),
)When to use:
Strengths:
Limitations:
Examples:
// Health checks every 30 seconds
gocron.DurationJob(30*time.Second)
// Cache refresh every 5 minutes
gocron.DurationJob(5*time.Minute)
// Backup every hour
gocron.DurationJob(time.Hour)
// Daily cleanup at 24-hour intervals
gocron.DurationJob(24*time.Hour)func DurationRandomJob(min, max time.Duration) JobDefinitionRuns at random intervals:
j, _ := s.NewJob(
gocron.DurationRandomJob(time.Minute, 5*time.Minute),
gocron.NewTask(myFunc),
)When to use:
Strengths:
Limitations:
Examples:
// Metrics collection with jitter (1-5 minutes)
gocron.DurationRandomJob(time.Minute, 5*time.Minute)
// API polling with randomness (30s - 2min)
gocron.DurationRandomJob(30*time.Second, 2*time.Minute)func CronJob(cronExpression string, withSeconds bool) JobDefinitionRuns according to cron expression:
// Every day at 9 AM
j, _ := s.NewJob(
gocron.CronJob("0 9 * * *", false),
gocron.NewTask(myFunc),
)
// Every 15 minutes
j, _ = s.NewJob(
gocron.CronJob("*/15 * * * *", false),
gocron.NewTask(myFunc),
)
// With seconds: every 30 seconds
j, _ = s.NewJob(
gocron.CronJob("30 * * * * *", true),
gocron.NewTask(myFunc),
)When to use:
Strengths:
Limitations:
Cron Format:
5 fields (withSeconds=false):
minute hour day month weekday
0-59 0-23 1-31 1-12 0-6
6 fields (withSeconds=true):
second minute hour day month weekday
0-59 0-59 0-23 1-31 1-12 0-6Common Patterns:
// Every minute
"* * * * *"
// Every hour at minute 0
"0 * * * *"
// Every day at midnight
"0 0 * * *"
// Every day at 9 AM
"0 9 * * *"
// Every Monday at 9 AM
"0 9 * * 1"
// Every weekday (Mon-Fri) at 9 AM
"0 9 * * 1-5"
// Every 15 minutes
"*/15 * * * *"
// Every hour between 9 AM and 5 PM, Mon-Fri
"0 9-17 * * 1-5"
// First day of every month at midnight
"0 0 1 * *"func DailyJob(interval uint, atTimes AtTimes) JobDefinitionRuns every interval days at specific times:
// Every day at 9 AM
j, _ := s.NewJob(
gocron.DailyJob(
1,
gocron.NewAtTimes(gocron.NewAtTime(9, 0, 0)),
),
gocron.NewTask(myFunc),
)When to use:
Strengths:
Examples:
// Every day at 9 AM
gocron.DailyJob(1, gocron.NewAtTimes(gocron.NewAtTime(9, 0, 0)))
// Every day at 9 AM and 5 PM
gocron.DailyJob(
1,
gocron.NewAtTimes(
gocron.NewAtTime(9, 0, 0),
gocron.NewAtTime(17, 0, 0),
),
)
// Every 2 days at noon
gocron.DailyJob(2, gocron.NewAtTimes(gocron.NewAtTime(12, 0, 0)))func WeeklyJob(interval uint, daysOfTheWeek Weekdays, atTimes AtTimes) JobDefinitionRuns every interval weeks on specific days:
// Every Monday at 9 AM
j, _ := s.NewJob(
gocron.WeeklyJob(
1,
gocron.NewWeekdays(time.Monday),
gocron.NewAtTimes(gocron.NewAtTime(9, 0, 0)),
),
gocron.NewTask(myFunc),
)When to use:
Strengths:
Examples:
// Every Monday at 9 AM
gocron.WeeklyJob(
1,
gocron.NewWeekdays(time.Monday),
gocron.NewAtTimes(gocron.NewAtTime(9, 0, 0)),
)
// Every Monday and Friday at 9 AM
gocron.WeeklyJob(
1,
gocron.NewWeekdays(time.Monday, time.Friday),
gocron.NewAtTimes(gocron.NewAtTime(9, 0, 0)),
)
// Every Saturday at 3 AM (maintenance)
gocron.WeeklyJob(
1,
gocron.NewWeekdays(time.Saturday),
gocron.NewAtTimes(gocron.NewAtTime(3, 0, 0)),
)
// Every 2 weeks on Friday at 5 PM
gocron.WeeklyJob(
2,
gocron.NewWeekdays(time.Friday),
gocron.NewAtTimes(gocron.NewAtTime(17, 0, 0)),
)func MonthlyJob(interval uint, daysOfTheMonth DaysOfTheMonth, atTimes AtTimes) JobDefinitionRuns every interval months on specific days:
// First day of every month at noon
j, _ := s.NewJob(
gocron.MonthlyJob(
1,
gocron.NewDaysOfTheMonth(1),
gocron.NewAtTimes(gocron.NewAtTime(12, 0, 0)),
),
gocron.NewTask(myFunc),
)
// Last day of every month at midnight
j, _ = s.NewJob(
gocron.MonthlyJob(
1,
gocron.NewDaysOfTheMonth(-1),
gocron.NewAtTimes(gocron.NewAtTime(0, 0, 0)),
),
gocron.NewTask(myFunc),
)When to use:
Strengths:
Examples:
// First of every month at midnight
gocron.MonthlyJob(1, gocron.NewDaysOfTheMonth(1), gocron.NewAtTimes(gocron.NewAtTime(0, 0, 0)))
// Last day of every month
gocron.MonthlyJob(1, gocron.NewDaysOfTheMonth(-1), gocron.NewAtTimes(gocron.NewAtTime(23, 59, 0)))
// 15th and last day of every month
gocron.MonthlyJob(1, gocron.NewDaysOfTheMonth(15, -1), gocron.NewAtTimes(gocron.NewAtTime(12, 0, 0)))
// Every 3 months on the 1st (quarterly)
gocron.MonthlyJob(3, gocron.NewDaysOfTheMonth(1), gocron.NewAtTimes(gocron.NewAtTime(0, 0, 0)))func OneTimeJob(startAt OneTimeJobStartAtOption) JobDefinitionRuns once, then automatically removed:
// Run immediately
j, _ := s.NewJob(
gocron.OneTimeJob(gocron.OneTimeJobStartImmediately()),
gocron.NewTask(myFunc),
)
// Run in 1 hour
futureTime := time.Now().Add(time.Hour)
j, _ = s.NewJob(
gocron.OneTimeJob(gocron.OneTimeJobStartDateTime(futureTime)),
gocron.NewTask(myFunc),
)When to use:
Strengths:
See Advanced: Time-Based Scheduling for complete details.
| Need | Use |
|---|---|
| Every N seconds/minutes/hours | DurationJob |
| Random intervals | DurationRandomJob |
| Complex time pattern | CronJob |
| Every day at specific time | DailyJob |
| Specific weekdays | WeeklyJob |
| Specific days of month | MonthlyJob |
| Run once | OneTimeJob |
| Priority | Best Choice |
|---|---|
| Most readable | DailyJob, WeeklyJob, MonthlyJob |
| Familiar to cron users | CronJob |
| Simple intervals | DurationJob |
| Randomness | DurationRandomJob |
| Precision | Options |
|---|---|
| Seconds | DurationJob, CronJob (withSeconds=true) |
| Minutes | All types |
| Specific time of day | DailyJob, WeeklyJob, MonthlyJob, CronJob |
| Specific weekday | WeeklyJob, CronJob |
| Specific day of month | MonthlyJob, CronJob |
// Duration: Simple and clear
gocron.DurationJob(5*time.Minute)
// Cron: More complex, same result
gocron.CronJob("*/5 * * * *", false)Recommendation: Use DurationJob for simplicity.
// Daily: Most readable
gocron.DailyJob(1, gocron.NewAtTimes(gocron.NewAtTime(9, 0, 0)))
// Cron: More concise if familiar
gocron.CronJob("0 9 * * *", false)Recommendation: Use DailyJob for clarity, CronJob if you prefer cron syntax.
// Weekly: Most readable
gocron.WeeklyJob(
1,
gocron.NewWeekdays(time.Monday),
gocron.NewAtTimes(gocron.NewAtTime(9, 0, 0)),
)
// Cron: More concise
gocron.CronJob("0 9 * * 1", false)Recommendation: Use WeeklyJob for readability.
// Monthly: Handles variable month lengths
gocron.MonthlyJob(
1,
gocron.NewDaysOfTheMonth(-1),
gocron.NewAtTimes(gocron.NewAtTime(0, 0, 0)),
)
// Cron: Cannot express "last day"
// Would need: "0 0 28-31 * *" (and check if it's last day)Recommendation: Use MonthlyJob — cron cannot properly express this.
// Cron: Perfect for this pattern
gocron.CronJob("0 9-17 * * 1-5", false)
// Weekly: Would need 45 jobs (5 days × 9 hours)
// Not practicalRecommendation: Use CronJob for complex patterns.
// Good: readable
gocron.DailyJob(1, gocron.NewAtTimes(gocron.NewAtTime(9, 0, 0)))
// Less clear: requires cron knowledge
gocron.CronJob("0 9 * * *", false)// Good: simple and clear
gocron.DurationJob(5*time.Minute)
// Overkill: unnecessary complexity
gocron.CronJob("*/5 * * * *", false)// Good: perfect for business hours
gocron.CronJob("0 9-17 * * 1-5", false)
// Bad: would require multiple jobs
// gocron.WeeklyJob(...)// Set scheduler timezone
loc, _ := time.LoadLocation("America/New_York")
s, _ := gocron.NewScheduler(gocron.WithLocation(loc))
// All time-based jobs use this timezone
s.NewJob(
gocron.DailyJob(1, gocron.NewAtTimes(gocron.NewAtTime(9, 0, 0))),
gocron.NewTask(myFunc),
)// Warmup immediately, then regular schedule
s.NewJob(
gocron.OneTimeJob(gocron.OneTimeJobStartImmediately()),
gocron.NewTask(warmup),
)
s.NewJob(
gocron.DurationJob(time.Hour),
gocron.NewTask(warmup),
)Install with Tessl CLI
npx tessl i tessl/golang-github-com-go-co-op-gocron-v2docs
api
examples
guides