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.
Jobs scheduled at specific times of day, week, or month.
func DailyJob(interval uint, atTimes AtTimes) JobDefinitionRuns every N days at specified times of day.
Parameters:
interval: Number of days between runs, must be > 0atTimes: Times during the day (created with NewAtTimes)Errors:
ErrDailyJobZeroInterval: interval is 0ErrDailyJobAtTimesNil: atTimes is nilErrDailyJobAtTimeNil: individual atTime within atTimes is nilErrDailyJobHours: hours not in 0-23ErrDailyJobMinutesSeconds: minutes or seconds not in 0-59func NewAtTime(hours, minutes, seconds uint) AtTime
func NewAtTimes(atTime AtTime, atTimes ...AtTime) AtTimes// Every day at 8 AM
gocron.DailyJob(1, gocron.NewAtTimes(
gocron.NewAtTime(8, 0, 0),
))
// Every day at 8 AM and 8 PM
gocron.DailyJob(1, gocron.NewAtTimes(
gocron.NewAtTime(8, 0, 0),
gocron.NewAtTime(20, 0, 0),
))
// Every 2 days at noon
gocron.DailyJob(2, gocron.NewAtTimes(
gocron.NewAtTime(12, 0, 0),
))
// Every day at 9:30:15
gocron.DailyJob(1, gocron.NewAtTimes(
gocron.NewAtTime(9, 30, 15),
))WithStartAt(WithStartImmediately()) to run today if time hasn't passedWithLocation)func WeeklyJob(interval uint, daysOfTheWeek Weekdays, atTimes AtTimes) JobDefinitionRuns every N weeks on specified days at specified times.
Parameters:
interval: Number of weeks between runs, must be > 0daysOfTheWeek: Days to run (created with NewWeekdays)atTimes: Times during the day (created with NewAtTimes)Errors:
ErrWeeklyJobZeroInterval: interval is 0ErrWeeklyJobDaysOfTheWeekNil: daysOfTheWeek is nilErrWeeklyJobAtTimesNil: atTimes is nilErrWeeklyJobAtTimeNil: individual atTime is nilErrWeeklyJobHours: hours not in 0-23ErrWeeklyJobMinutesSeconds: minutes or seconds not in 0-59func NewWeekdays(weekday time.Weekday, weekdays ...time.Weekday) WeekdaysWeekdays: time.Sunday, time.Monday, time.Tuesday, time.Wednesday, time.Thursday, time.Friday, time.Saturday
// Every Monday at 9 AM
gocron.WeeklyJob(
1,
gocron.NewWeekdays(time.Monday),
gocron.NewAtTimes(gocron.NewAtTime(9, 0, 0)),
)
// Every Monday and Wednesday at 9 AM
gocron.WeeklyJob(
1,
gocron.NewWeekdays(time.Monday, time.Wednesday),
gocron.NewAtTimes(gocron.NewAtTime(9, 0, 0)),
)
// Every 2 weeks on Friday at 5 PM
gocron.WeeklyJob(
2,
gocron.NewWeekdays(time.Friday),
gocron.NewAtTimes(gocron.NewAtTime(17, 0, 0)),
)
// Monday and Friday at 9 AM and 5 PM
gocron.WeeklyJob(
1,
gocron.NewWeekdays(time.Monday, time.Friday),
gocron.NewAtTimes(
gocron.NewAtTime(9, 0, 0),
gocron.NewAtTime(17, 0, 0),
),
)time.Weekday convention)WithStartAt(WithStartDateTimePast(...)) to align with specific weekfunc MonthlyJob(interval uint, daysOfTheMonth DaysOfTheMonth, atTimes AtTimes) JobDefinitionRuns every N months on specified days at specified times.
Parameters:
interval: Number of months between runs, must be > 0daysOfTheMonth: Days to run (created with NewDaysOfTheMonth)atTimes: Times during the day (created with NewAtTimes)Errors:
ErrMonthlyJobZeroInterval: interval is 0ErrMonthlyJobDaysNil: daysOfTheMonth is nilErrMonthlyJobAtTimesNil: atTimes is nilErrMonthlyJobAtTimeNil: individual atTime is nilErrMonthlyJobDays: day not in 1-31 or -1 to -31 (or is 0)ErrMonthlyJobHours: hours not in 0-23ErrMonthlyJobMinutesSeconds: minutes or seconds not in 0-59func NewDaysOfTheMonth(day int, moreDays ...int) DaysOfTheMonth// On the 1st of every month at noon
gocron.MonthlyJob(
1,
gocron.NewDaysOfTheMonth(1),
gocron.NewAtTimes(gocron.NewAtTime(12, 0, 0)),
)
// On the 1st and 15th at noon
gocron.MonthlyJob(
1,
gocron.NewDaysOfTheMonth(1, 15),
gocron.NewAtTimes(gocron.NewAtTime(12, 0, 0)),
)
// Last day of every month at midnight
gocron.MonthlyJob(
1,
gocron.NewDaysOfTheMonth(-1),
gocron.NewAtTimes(gocron.NewAtTime(0, 0, 0)),
)
// 5 days before end of month at 10 AM
gocron.MonthlyJob(
1,
gocron.NewDaysOfTheMonth(-5),
gocron.NewAtTimes(gocron.NewAtTime(10, 0, 0)),
)
// Every 2 months on the 1st at midnight
gocron.MonthlyJob(
2,
gocron.NewDaysOfTheMonth(1),
gocron.NewAtTimes(gocron.NewAtTime(0, 0, 0)),
)
// Multiple days and times: 1st and 15th at 9 AM and 5 PM
gocron.MonthlyJob(
1,
gocron.NewDaysOfTheMonth(1, 15),
gocron.NewAtTimes(
gocron.NewAtTime(9, 0, 0),
gocron.NewAtTime(17, 0, 0),
),
)j, err := s.NewJob(
gocron.DailyJob(1, gocron.NewAtTimes(
gocron.NewAtTime(9, 0, 0),
)),
gocron.NewTask(func() {
generateDailyReport()
}),
gocron.WithName("daily-report"),
)j, err := s.NewJob(
gocron.WeeklyJob(
1,
gocron.NewWeekdays(time.Sunday),
gocron.NewAtTimes(gocron.NewAtTime(2, 0, 0)),
),
gocron.NewTask(func() {
cleanupOldData()
}),
gocron.WithName("weekly-cleanup"),
)j, err := s.NewJob(
gocron.MonthlyJob(
1,
gocron.NewDaysOfTheMonth(1),
gocron.NewAtTimes(gocron.NewAtTime(0, 0, 0)),
),
gocron.NewTask(func() {
processMonthlyBilling()
}),
gocron.WithName("monthly-billing"),
)j, err := s.NewJob(
gocron.MonthlyJob(
1,
gocron.NewDaysOfTheMonth(-1), // last day of month
gocron.NewAtTimes(gocron.NewAtTime(23, 0, 0)),
),
gocron.NewTask(func() {
generateMonthEndReport()
}),
gocron.WithName("month-end-report"),
)j, err := s.NewJob(
gocron.DailyJob(1, gocron.NewAtTimes(
gocron.NewAtTime(9, 0, 0),
gocron.NewAtTime(12, 0, 0),
gocron.NewAtTime(15, 0, 0),
gocron.NewAtTime(18, 0, 0),
)),
gocron.NewTask(func() {
syncData()
}),
)All time-based schedules respect the scheduler's location set via WithLocation. Default is time.Local.
// Scheduler in Chicago time
loc, _ := time.LoadLocation("America/Chicago")
s, _ := gocron.NewScheduler(gocron.WithLocation(loc))
// All jobs use Chicago time
j, _ := s.NewJob(
gocron.DailyJob(1, gocron.NewAtTimes(gocron.NewAtTime(9, 0, 0))),
gocron.NewTask(doTask),
) // Runs at 9 AM Chicago timeInstall with Tessl CLI
npx tessl i tessl/golang-github-com-go-co-op-gocron-v2docs
api
examples
guides