2017-08-29 86 views
1

我使用的似乎是robfig最受欢迎的cron包:https://godoc.org/github.com/robfig/cron。目前,我知道我可以调用带有每小时cron作业:但是我不知道是否可以设置它,使它后才开始有没有办法在某个日期/时间调用cron作业?

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

(例如)九月,2017年1?如果使用该软件包是不可能的,我还能如何实现这一目标?谢谢。

+4

只是把像'如果time.Now()后(targetDate)'代码你执行。 – Adrian

+0

@Adrian然后我想我会需要某种循环来检查当前时间每隔一段时间? – Pig

+0

这应该是不必要的,因为你已经安排它执行重复计划吗? – Adrian

回答

1

添加到@Adrians评论,

封装robfig/cron支持cron表达式的格式。在上午9点30分,上午10点30分,上午11点30分,每小时运行30分钟。你可以使用

c.AddFunc( “0 30 * * * *”,FUNC(){})

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

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格式。

+0

感谢您的解释。如果我想在't'开始,然后每隔30分钟后怎么办? – Pig

+0

You可以通过两种方式达到相同效果: 1. c.AddFunc(“0 0,30 * * * *”,func(){fmt.Println(“每隔30分钟”)}) 2. c.AddFunc “@every 30m”,func(){fmt.Println(“每隔30分钟”)}) –

1

如果您想要自定义日程安排,请执行您自己的scheduler,然后使用Cron.Schedule注册作业。下面是一个例子实施一段时间后重复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() 
} 
相关问题