 与 @快捷方式全解)
cron 调度符号深度解析5 个特殊字符 (* / , - ?) 与 快捷方式全解【免费下载链接】crona cron library for go项目地址: https://gitcode.com/gh_mirrors/cr/cron使用 Go 编写定时任务时cron表达式是最常用的调度语法。本文带你一次看懂 cron 表达式中的 5 个特殊字符——星号*、斜杠/、逗号,、连字符-、问号?——以及hourly、every 5m等 快捷方式的完整用法并附上字段取值表和常见踩坑点让你从零写对第一条 cron 调度规则。 一分钟看懂 cron 表达式的 5 个字段标准 cron 表达式由5 个空格分隔的字段组成从左到右依次是字段取值范围支持的特殊字符说明分钟 (Minutes)0–59* / , -每小时的第几分钟小时 (Hours)0–23* / , -每天的第几点日 (Day of month)1–31* / , - ?每月第几天月 (Month)1–12 或 JAN–DEC* / , -月份支持英文缩写不区分大小写星期 (Day of week)0–6 或 SUN–SAT* / , - ?周几0 星期日┌───────────── 分钟 (0-59) │ ┌───────────── 小时 (0-23) │ │ ┌───────────── 日 (1-31) │ │ │ ┌───────────── 月 (1-12, JAN-DEC) │ │ │ │ ┌───────────── 星期 (0-6, SUN-SAT) * * * * *几个容易忽略的细节默认解析器不包含秒字段。如果你需要秒级精度类似 Quartz 的 6 位格式可以用cron.WithSeconds()选项开启实现见 option.go。月份和星期字段支持JAN-DEC、SUN-SAT等名称且大小写不敏感。所有字段名、边界值和解析选项定义在 spec.go 和 parser.go。 5 大特殊字符逐个拆解1️⃣ 星号*匹配全部*表示该字段所有取值都匹配是最常见的偷懒写法。表达式含义* * * * *每分钟执行0 * * * *每小时的第 0 分钟整点0 3 * * *每天凌晨 3 点2️⃣ 斜杠/步长步长是相对起点的/用于描述区间内的间隔后面跟步长数字有三种常见形态写法含义* /15即*/15整个范围从第一个值开始每隔 150,15,30,453-59/15从 3 开始每隔 153,18,33,485/15等价于5-59/155,20,35,50第三个形态N/step是本项目的一个特色语义N/step被解释为N-MAX/step即从 N 开始直到该字段最大值中间不折返wrap around。这一点在 parser.go 中实现测试用例0/15 * * * *、5/15 * * * *在 spec_test.go 中有明确验证。⚠️ 常见误解15/15不是从 15 到 15而是 15 到最大值、每 15 一次即15,30,45。3️⃣ 逗号,枚举多个值,用来分隔一个列表表示在这些值之一表达式含义0 8,12,18 * * *每天 8 点、12 点、18 点0 0 1 * JAN,JUL *每年 1 月和 7 月的 1 号30 * * * MON,WED,FRI每周一、三、五的半点逗号可以与范围、步长自由组合例如1,15 */2 * * *。4️⃣ 连字符-定义范围-定义闭区间两端都包含表达式含义30 3-6,20-23 * * *每天 3–6 点、20–23 点的第 30 分钟0 9-17 * * 1-5工作日 9 点到 17 点整0 0 * * MON-FRI工作日名称形式范围还可以嵌套步长20-35/15表示20, 35见 spec_test.go 的跨时区滚动测试。5️⃣ 问号?让位给日或星期?只能用在日和星期这两个字段作用是我不关心这一项请交给另一项判断。这里藏着 cron 表达式最精妙的一个规则 当日和星期都有限制时二者是 OR 关系——任意一个匹配就算匹配当其中一个字段是*或?即不限时二者变成 AND 关系——必须同时满足。这个 AND/OR 切换逻辑由starBit标志位驱动源码在 spec.go* * 1,15 * Sun → 每月 1 号、15 号或 每周日OR满足其一即可 0 8 ? * MON → 每周一早上 8 点DOW 生效Dom 用 ? 让位 30 08 15 Jul ? → 每年 7 月 15 号 08:30DOW 用 ? 让位解析阶段?与*会展开成相同的取值范围parser.go真正的区别只在上面这个 AND/OR 判断中体现。项目测试里大量使用* * * * * ?这种写法见 cron_test.go正是为了显式地把星期让出来。⏰ 快捷方式全解5 个预定义计划 every 间隔标准 5 位写法之外cron还支持以开头的预定义调度descriptor全部清单如下快捷方式等价表达式含义yearly/annually0 0 1 1 *每年 1 月 1 日 0 点monthly0 0 1 * *每月 1 号 0 点weekly0 0 * * 0每周日 0 点daily/midnight0 0 * * *每天 0 点hourly0 * * * *每小时整点实现位于 parser.go每个快捷方式都会被展开为一张精确到秒的位图调度表。every固定间隔调度除了上面 5 个还有万能写法every duration表示从注册时刻起每隔固定时长执行一次表达式含义every 30s每 30 秒every 1h30m每 1 小时 30 分every 15m每 15 分钟时长格式遵循 Go 的time.ParseDuration规则。注意两点见 constantdelay.go 与 doc.go间隔不支持小于 1 秒会被向上取整到 1 秒间隔不扣减任务本身的执行耗时——任务跑 3 分钟、间隔设 5 分钟那么两次执行之间实际只剩 2 分钟空闲。 顺手一提用CRON_TZ指定时区默认情况下所有调度都按本机时区解释。如果想让某条任务固定按东京时间 4:30 执行只需在表达式前加一个前缀CRON_TZAsia/Tokyo 30 04 * * *解析器会识别CRON_TZ或旧式的TZ前缀并加载对应时区parser.go。也提醒一下官方文档的警告夏令时跳跃过去的那个时刻如不存在的凌晨 2:30排在该时刻的任务不会被执行。 核心文件导航想深入源码按这条路径走最高效文件看什么doc.go包级文档字段表、特殊字符、计划、时区的权威说明parser.go表达式解析入口、/的N-MAX语义、快捷方式展开spec.go位图调度、下一次触发时间的推算、Dom/Dow 的 AND/OR 规则option.goWithSeconds、WithParser、WithLocation等配置项constantdelay.goevery固定间隔调度的实现parser_test.go / spec_test.go各种边界的官方测试用例是最好的活文档✅ 避坑清单5/15≠ 只跑一次——它是5-59/15即 5、20、35、50 分各一次?只能用于日和星期写在分钟或月字段会解析报错日 星期同时写具体值 OR想让它们同时生效其中一个必须写*或?默认没有秒字段需要秒级精度时记得加cron.WithSeconds()every从任务注册时刻计时不是从整点开始任务耗时也不在间隔内扣除。掌握以上内容你就能覆盖绝大多数定时任务的写法了先用*铺底再用,、-、/精细裁剪时间和日期最后遇到整点、整月这类固定场景直接甩快捷方式。【免费下载链接】crona cron library for go项目地址: https://gitcode.com/gh_mirrors/cr/cron创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考