Cron 表达式
这一页只讲
soulsoft_scheduler当前真实支持的 Cron 规则和调试方式。
适用场景
- 需要表达"每天几点""每月第几个星期几""最后一个工作日"这类规则
- 想确认当前库的 Cron 语法边界
- 想在调度前先验证表达式和下一次触发时间
核心问题
soulsoft_scheduler 提供了公开的 CronExpr 类型:
CronExpr.parse(expr: String)getNextFireTime(datetime: DateTime)
这意味着 Cron 不只是给调度器内部用,你也可以在业务或测试里主动验证表达式。
基本格式
整体格式是 6 到 7 段,按空格分隔:
text
秒 分 时 日 月 周 [年]示例:
0 0 2 * * ?*/5 * * * * ?0 0 8 ? * 1-5
语法规则
字段范围
| 段 | 字段 | 范围 |
|---|---|---|
| 1 | 秒 | 0 - 59 |
| 2 | 分 | 0 - 59 |
| 3 | 时 | 0 - 23 |
| 4 | 日 | 1 - 31 |
| 5 | 月 | 1 - 12 |
| 6 | 周 | 0 - 6,0 为周日 |
| 7 | 年 | 1970 - 2970,可选 |
支持的常见语法
| 语法 | 说明 |
|---|---|
* | 通配整个字段 |
? | 日或周字段未指定 |
x | 固定值 |
x-y/step | 范围步长 |
*/step | 全范围步长 |
xL | 日字段的倒数第 x 天 |
LW | 最后一个工作日 |
x#n | 周字段的第 n 个星期 x |
验证
常用示例
| 表达式 | 含义 |
|---|---|
*/5 * * * * ? | 每 5 秒 |
0 0 2 * * ? | 每天凌晨 2 点 |
0 0 8 ? * 1-5 | 工作日早上 8 点 |
0 0 0 2L * ? | 每月倒数第二天零点 |
0 0 0 ? * 2#3 | 每月第三个星期二零点 |
在代码里验证
cangjie
import soulsoft_scheduler.infrastructure.*
let expr = CronExpr.parse("0-10/2,11-20/4 0 0 * * ?")
var next = DateTime.now()
for (_ in 1..10) {
next = expr.getNextFireTime(next)
println(next.format('yyyy-MM-dd HH:mm:ss'))
next = next.addSeconds(1)
}这个方式很适合:
- 写单元测试
- 在接入前验证复杂表达式
- 排查"为什么没按预期触发"
常见误区
- 日和周字段不要同时写成具体值,通常其中一个应该用
? */5是"每 5 个单位",不是"从第 5 个单位开始"- 复杂表达式先用
CronExpr.parse()和getNextFireTime()验证,再接入任务
相关专题
- 需要了解任务和触发器的完整 API → 任务与触发器
- 需要看调度器的最小可运行示例 → 快速开始
- 需要接入 Host 和 DI → 与 Host / DI 集成