Go 有没有办法在特定日期/时间调用cron作业?

Go 有没有办法在特定日期/时间调用cron作业?,go,cron,Go,Cron,我使用的是robfig最流行的cron包:。目前我知道我可以通过以下方式调用每小时一次的cron作业: c.AddFunc("@hourly", func() { fmt.Println("Every hour") }) 但是,我想知道是否可以将其设置为仅在2017年9月1日(例如)之后开始?如果无法使用该软件包,我还可以如何实现?谢谢。添加到@Adrians评论中 该包支持cron表达式格式。让cron每小时运行30分钟,即上午9:30、上午10:30、上午11:30。你可以用 c、 Add

我使用的是robfig最流行的cron包:。目前我知道我可以通过以下方式调用每小时一次的cron作业:

c.AddFunc("@hourly", func() { fmt.Println("Every hour") })

但是,我想知道是否可以将其设置为仅在2017年9月1日(例如)之后开始?如果无法使用该软件包,我还可以如何实现?谢谢。

添加到@Adrians评论中

该包支持cron表达式格式。让cron每小时运行30分钟,即上午9:30、上午10:30、上午11:30。你可以用

c、 AddFunc(“0 30****”,func(){})

在2017年9月1日之后运行cron的实现

package main

import (
    "fmt"
    "time"
    "github.com/robfig/cron"
)

func main() {

    // time set to Sep 1, 2017 00:00 Hours UTC
    t := time.Date(2017, time.September, 1, 0, 0, 0, 0, time.UTC) 

    c := cron.New()

    //using cron expression format to have the function run every hour on the half hour
    c.AddFunc("0 30 * * * *", func() {      

        if time.Now.After(t){
        fmt.Println("yay")
        //insert logic block
        } 
     })

}

注意:此包使用的cron表达式格式与标准unix cron格式不同。与unix cron格式不同,此软件包使用的表达式格式允许第二精度。

如果需要自定义调度,请实现自己的调度,然后使用注册作业。以下是在特定时间后重复CRON作业的示例实现:

package main

import (
    "fmt"
    "time"

    "github.com/robfig/cron"
)

type MyScheduler struct {
    At    time.Time
    Every time.Duration
}

func (s *MyScheduler) Next(t time.Time) time.Time {
    if t.After(s.At) {
        return t.Add(s.Every)
    }

    return s.At
}

func main() {
    c := cron.New()

    //Execute every 2 seconds after a certain time (5 second from now)
    now := time.Now()
    at := now.Add(5 * time.Second) //In your case, this should be: Sep 1st, 2017
    s := &MyScheduler{at, 2 * time.Second}

    c.Schedule(s, cron.FuncJob(
        func() {
            cur := time.Now()
            fmt.Printf("  [%v] CRON job executed after %v\n", cur, cur.Sub(now))
        }))

    fmt.Printf("Now: %v\n", now)
    c.Start()
    time.Sleep(10 * time.Second)
    c.Stop()
}

只要在您正在执行的代码中添加类似于
if time.Now().After(targetDate)
的内容。@Adrian那么我想我需要某种循环来不时检查当前时间?这应该是不必要的,因为您已经安排它按重复计划执行,对吗?@Adrian没错!谢谢这是一个cron库,它看起来完全能够处理这种日程安排。谢谢你的解释。如果我想从“t”开始,然后每30分钟一次呢?你可以通过两种方式实现同样的效果:1。c、 AddFunc(“0,30****”,func(){fmt.Println(“每三十分钟”)})2。c、 AddFunc(“@每30米”,func(){fmt.Println(“每30分钟”)})