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  }