gitee.com/h79/goutils@v1.22.10/common/scheduler/cron.go (about) 1 package scheduler 2 3 import ( 4 "fmt" 5 "github.com/robfig/cron/v3" 6 "time" 7 ) 8 9 // CronTrigger implements 10 // Examples: 11 // http://www.quartz-scheduler.org/documentation/quartz-2.3.0/tutorials/tutorial-lesson-06.html 12 // {秒数} {分钟} {小时} {日期} {月份} {星期} 13 // 1 Seconds (0-59) 14 // 2 Minutes (0-59) 15 // 3 Hours (0-23) 16 // 4 Day-of-Month (1-31) 17 // 5 Month (0-11) 18 // 6 Day-of-Week(1-7) 19 // 7 Year (optional field) 20 // 21 // 每个符号的意义 22 // * 表示所有值; 23 // ? 表示未说明的值,即不关心它为何值; 24 // - 表示一个指定的范围; 25 // , 表示附加一个可能值; 26 // / 符号前表示开始时间,符号后表示每次递增的值 27 // 28 // 一些cron表达式案例 29 // */5 * * * * ? 每隔5秒执行一次 30 // 0 */1 * * * ? 每隔1分钟执行一次 31 // 0 0 5-15 * * ? 每天5-15点整点触发 32 // 0 0/3 * * * ? 每三分钟触发一次 33 // 0 0-5 14 * * ? 在每天下午2点到下午2:05期间的每1分钟触发 34 // 0 0/5 14 * * ? 在每天下午2点到下午2:55期间的每5分钟触发 35 // 0 0/5 14,18 * * ? 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发 36 // 0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时 37 // 0 0 10,14,16 * * ? 每天上午10点,下午2点,4点 38 // 0 0 12 ? * WED 表示每个星期三中午12点 39 // 0 0 17 ? * TUES,THUR,SAT 每周二、四、六下午五点 40 // 0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44触发 41 // 0 15 10 ? * MON-FRI 周一至周五的上午10:15触发 42 // 0 0 23 L * ? 每月最后一天23点执行一次 43 // 0 15 10 L * ? 每月最后一日的上午10:15触发 44 // 0 15 10 ? * 6L 每月的最后一个星期五上午10:15触发 45 // 0 15 10 * * ? 2005 2005年的每天上午10:15触发 46 // 0 15 10 ? * 6L 2002-2005 2002年至2005年的每月的最后一个星期五上午10:15触发 47 // 0 15 10 ? * 6#3 每月的第三个星期五上午10:15触发 48 // 49 // "30 * * * * ?" 每半分钟触发任务 50 // "30 10 * * * ?" 每小时的10分30秒触发任务 51 // "30 10 1 * * ?" 每天1点10分30秒触发任务 52 // "30 10 1 20 * ?" 每月20号1点10分30秒触发任务 53 // "30 10 1 20 10 ? *" 每年10月20号1点10分30秒触发任务 54 // "30 10 1 20 10 ? 2011" 2011年10月20号1点10分30秒触发任务 55 // "30 10 1 ? 10 * 2011" 2011年10月每天1点10分30秒触发任务 56 // "30 10 1 ? 10 SUN 2011" 2011年10月每周日1点10分30秒触发任务 57 // "15,30,45 * * * * ?" 每15秒,30秒,45秒时触发任务 58 // "15-45 * * * * ?" 15到45秒内,每秒都触发任务 59 // "15/5 * * * * ?" 每分钟的每15秒开始触发,每隔5秒触发一次 60 // "15-30/5 * * * * ?" 每分钟的15秒到30秒之间开始触发,每隔5秒触发一次 61 // "0 0/3 * * * ?" 每小时的第0分0秒开始,每三分钟触发一次 62 // "0 15 10 ? * MON-FRI" 星期一到星期五的10点15分0秒触发任务 63 // "0 15 10 L * ?" 每个月最后一天的10点15分0秒触发任务 64 // "0 15 10 LW * ?" 每个月最后一个工作日的10点15分0秒触发任务 65 // "0 15 10 ? * 5L" 每个月最后一个星期四的10点15分0秒触发任务 66 // "0 15 10 ? * 5#3" 每个月第三周的星期四的10点15分0秒触发任务 67 // 五:表达式生成器 68 // 有很多的cron表达式在线生成器,这里给大家推荐几款 69 // http://www.pdtools.net/tools/becron.jsp 70 // http://cron.qqe2.com/ 71 type CronTrigger struct { 72 expr string 73 trigger cron.Schedule 74 location *time.Location 75 } 76 77 // Verify CronTrigger satisfies the Trigger interface. 78 var _ Trigger = (*CronTrigger)(nil) 79 80 // NewCronTrigger returns a new CronTrigger using the UTC location. 81 func NewCronTrigger(expr string) (*CronTrigger, error) { 82 parser := cron.NewParser(cron.Second | cron.Minute | cron.Hour | cron.Dom | cron.Month | cron.Dow | cron.Descriptor) 83 trigger, err := parser.Parse(expr) 84 if err != nil { 85 return nil, err 86 } 87 return &CronTrigger{trigger: trigger, expr: expr, location: time.Local}, nil 88 } 89 90 func (ct *CronTrigger) Type() string { 91 return "cron" 92 } 93 94 func (ct *CronTrigger) WithLocation(lc *time.Location) *CronTrigger { 95 ct.location = lc 96 return ct 97 } 98 99 // NextFireTime returns the next time at which the CronTrigger is scheduled to fire. 100 func (ct *CronTrigger) NextFireTime(prev int64) (int64, error) { 101 t := ct.trigger.Next(time.Unix(0, prev).In(ct.location)) 102 return t.UnixNano(), nil 103 } 104 105 // Description returns the description of the trigger. 106 func (ct *CronTrigger) Description() string { 107 return fmt.Sprintf("CronTrigger %s", ct.expr) 108 }