⏱️

Goでcronを扱う

2022/07/18に公開

このライブラリを使います
https://github.com/robfig/cron

$ go get github.com/robfig/cron/v3

cronを実行する

package main

import (
	"github.com/robfig/cron/v3"
	"log"
	"time"
)

func main() {
	c := cron.New()
	c.AddFunc("@every 1s", func() { log.Println("every 1s") })
	c.AddFunc("* * * * *", func() { log.Println("every 1m") })
	c.Start()
	time.Sleep(2 * time.Minute)
}
$ go run main.go
2022/07/18 17:00:57 every 1s
2022/07/18 17:00:58 every 1s
2022/07/18 17:00:59 every 1s
2022/07/18 17:01:00 every 1m
2022/07/18 17:01:00 every 1s
2022/07/18 17:01:01 every 1s
...

cronの書式にバリデーションをかける

func main() {
	p := cron.NewParser(cron.Minute | cron.Hour | cron.Dom | cron.Month | cron.Dow)
	s, err := p.Parse("* * * *")
	if err != nil {
		panic(err)
	}
	fmt.Println(s)
}
$ go run main.go
panic: expected exactly 5 fields, found 4: [* * * *]
...

cronの実行スケジュールを確認する

func main() {
	p := cron.NewParser(cron.Minute | cron.Hour | cron.Dom | cron.Month | cron.Dow)
	s, err := p.Parse("* * * * *")
	if err != nil {
		log.Fatal(err)
	}
	t := time.Now()
	for i := 0; i < 5; i++ {
		t = s.Next(t)
		fmt.Println(t)
	}
}
$ go run main.go
2022-07-18 17:16:00 +0900 JST
2022-07-18 17:17:00 +0900 JST
2022-07-18 17:18:00 +0900 JST
2022-07-18 17:19:00 +0900 JST
2022-07-18 17:20:00 +0900 JST

Discussion