专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 cron表达式解析

cron表达式解析

更新时间:2022-04-24 09:21:12 来源:动力节点 浏览2027次

给定一个 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 之间的数字。它允许您指定构造,例如给定月份的“第二个星期五”。

预定义的 cron 表达式

条目描述相当于
@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在线学习,里面的课程内容从入门到精通,通俗易懂,适合小白学习,希望对大家能够有所帮助。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>