crontab格式
crond是linux下用于周期性地执行某个任务的一个守护进程,crond进程会每分钟检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。向crond进程提交crontab文件即可设置周期任务。
用户所建立的crontab文件中,每一行都代表一项任务,,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:
minute hour day month week command
参数含义
-
minute: 表示分钟,可以是从0到59之间的任何整数。
-
hour:表示小时,可以是从0到23之间的任何整数。
-
day:表示日期,可以是从1到31之间的任何整数。
-
month:表示月份,可以是从1到12之间的任何整数。
-
week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
-
command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。
在以上各个字段中,还可以使用以下特殊字符:
-
星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
-
逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
-
中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
-
正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。
注意,crontab不支持 数字/数字 的格式,比如 5/10 不能够实现从5分开始,每10分钟执行一次。可以在
https://crontab.guru/ 上检查crontab格式是否正确
图中显示这个语句时不标准的,有可能某些时间点不执行(实测确实如此)
调用远程调度服务 时,可以用crontab中*的写法,创建周期执行的任务。创建任务时,不需要提供日期,只需要提供开始时刻。参考dorado,周期任务有几个级别
分钟级任务只能选时间间隔10、20和30,然后还要一个执行时刻,比如间隔为10,这个时刻就是0-9之间的一个数字。其他级别同理。
当前先实现分钟级别的调度,其他的后面再补充。
实现分钟级的时候,可以先直接以当前时间作为开始执行时间发送,后面再补充。
golang时间格式
其他语言一般格式化字符串是yyyy-MM-dd HH:mm:ss,而Go语言是使用Go的诞生时间2006-01-02 15:04:05。
go 的time package 提供了两个函数:
-
time.Format函数,用来对时间进行格式化输出;
-
time.Parse函数,用来解析字符串类型的时间到time.Time。
time.Format
time.Format函数把time.Time类型的时间转换成格式化字符串
now := time.Now()
fmt.Println(now.Format("2006-01-02 15:04:05"))
time.Parse
参考 https://my.oschina.net/iyf/blog/601377
time.Parse函数把字符串格式的时间解析成time.Time类型的时间。
withNanos := "2006-01-02 15:04:05"
t, _ := time.Parse(withNanos, "2013-10-05 18:30:50")
fmt.Println(t.Year())
fmt.Println(t.Month())
fmt.Println(t.Day()) //多少号
fmt.Println(t.Weekday()) //星期几
fmt.Println(t.Hour())
fmt.Println(t.Minute())
fmt.Println(t.Second())
把 hh:mm格式的字符串解析成time.Time类型的时间。
t, _ := time.Parse("15:04", "21:54")
fmt.Println(t.Hour())
fmt.Println(t.Minute())
时间加减
参考 https://studygolang.com/articles/8919
比如给目标时间加三分钟
withNanos := "2006-01-02 15:04:05"
t, _ := time.Parse(withNanos, "2020-08-04 17:50:00")
m, _ := time.ParseDuration("+1m")
m1 := t.Add(3 * m)
fmt.Println(m1) //输出 2020-08-04 17:53:00 +0000 UTC