更新时间:2022-04-24 09:21:12 来源:极悦 浏览2338次
给定一个 cron 表达式和一个时间戳,您可以获得满足 cron 表达式的下一个时间戳。
在另一个项目中,我决定使用 cron 表达式语法来编码调度信息。因此,这个独立的库用于解析和应用时间戳到 cron 表达式。
此实现中的时间匹配算法是高效的,它尽可能避免猜测下一个匹配时间戳,这是许多实现中常见的技术。
还有一个配套的命令行实用程序来评估 cron 时间表达式:https ://github.com/gorhill/cronexpr/tree/master/cronexpr (当然使用这个库)。
秒数 0-59 * / , -
分钟 是 0-59 * / , -
小时 是 0-23 * / , -
日期 是 1-31 * / , - LW
月份 是 1-12 或 JAN-DEC * / , -
星期几 是 0-6 或 SUN-SAT * / , - L #
年份 1970–2099 * / , -
星号 ( * )
星号表示 cron 表达式匹配该字段的所有值。例如,在第 4 个字段(月)中使用星号表示每个月。
斜线 ( / )
斜线描述范围的增量。例如3-59/15,在分钟字段中指示一小时的第三分钟以及之后每 15 分钟一次。该形式*/...等价于“first-last/...”形式,即在字段的最大可能范围上递增。
逗号 ( , )
逗号用于分隔列表中的项目。例如,MON,WED,FRI在第 5 个字段(星期几)中使用表示星期一、星期三和星期五。
连字符 ( - )
连字符定义范围。例如,2000-2010 表示从公元 2000 年到 2010 年之间的每一年,包括在内。
大号
L代表“最后”。当在星期几字段中使用时,它允许您指定构造,例如5L给定月份的“最后一个星期五”( )。在 day-of-month 字段中,它指定该月的最后一天。
W
W日期字段允许使用该字符。此字符用于指定距给定日期最近的工作日(周一至周五)。例如,如果您要指定15W为 day-of-month 字段的值,则其含义是:“距每月 15 日最近的工作日”。
因此,如果 15 日是星期六,则触发器会在 14 日星期五触发。如果 15 日是星期日,则触发器会在 16 日星期一触发。如果 15 日是星期二,那么它会在 15 日星期二触发。但是,如果您指定1W日期的值,并且第 1 天是星期六,则触发器会在第 3 天的星期一触发,因为它不会“跳过”一个月的日期边界。
W仅当月份中的某天是一天,而不是日期范围或日期列表时,才可以指定该字符。
该W字符还可以与 结合L,即LW表示“本月的最后一个工作日”。
哈希 (#)
#允许用于星期几字段,并且后面必须跟一个介于 1 到 5 之间的数字。它允许您指定构造,例如给定月份的“第二个星期五”。
条目描述相当于
@annually 每年 1 月 1 日凌晨午夜运行一次 0 0 0 1 1 * *
@yearly 每年 1 月 1 日午夜运行一次 0 0 0 1 1 * *
@monthly 每月第一天凌晨的午夜运行一次 0 0 0 1 * * *
@weekly 每周在周日早上的午夜运行一次 0 0 0 * * 0 *
@daily 每天午夜运行一次 0 0 0 * * * *
@hourly 每小时开始运行一次 0 0 * * * * *
@reboot 不支持
如果仅存在六个字段,0则附加第二个字段,即* * * * * 2013内部成为0 * * * * * 2013。
如果仅存在五个字段,0则附加第二个字段并附加一个通配符年份字段,即* * * * Mon内部成为0 * * * * Mon *。
星期字段的域是 [0-7] 而不是 [0-6],7 是星期日(如 0)。这符合http://linux.die.net/man/5/crontab#。
截至目前,如果提供了格式错误的 cron 表达式,则代码的行为尚未确定
去获取 github.com/gorhill/cronexpr
导入库:
导入“github.com/gorhill/cronexpr”
导入“时间”
最简单的方法:
nextTime := cronexpr.MustParse("0 0 29 2 *").Next(time.Now())
假设time.Now()是“2013-08-29 09:28:00”,那么nextTime将是“2016-02-29 00:00:00”。
如果要重用它,可以保留返回的 Expression 指针:
expr := cronexpr.MustParse("0 0 29 2 *")
nextTime := expr.Next(time.Now())
...
nextTime = expr.Next(nextTime)
用于time.IsZero()查明是否返回了有效时间。例如,
cronexpr.MustParse("* * * * * 1980").Next(time.Now()).IsZero()
将返回true,而
cronexpr.MustParse("* * * * * 2050").Next(time.Now()).IsZero()
将返回false(截至 2013 年 8 月 29 日...)
您还可以查询n下一个时间戳:
cronexpr.MustParse("0 0 29 2 *").NextN(time.Now(), 5)
它返回一段 time.Time 对象,包含以下时间戳(截至 2013 年 8 月 30 日):
2016-02-29 00:00:00
2020-02-29 00:00:00
2024-02-29 00:00:00
2028-02-29 00:00:00
2032-02-29 00:00:00
Next和返回的时间值NextN的时区始终是作为参数传递的时间值的时区,除非返回零时间值。如果大家想了解更多相关知识,不妨来关注一下极悦的Java极悦在线学习,里面的课程内容从入门到精通,通俗易懂,适合小白学习,希望对大家能够有所帮助。
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习