Skip to content

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

语法规则

字段范围

字段范围
10 - 59
20 - 59
30 - 23
41 - 31
51 - 12
60 - 60 为周日
71970 - 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() 验证,再接入任务

相关专题