Cron表达式生成
便捷生成Cron定时执行规则,模拟Cron的执行结果
参数位数详解 Standard vs Extended
选择错误的位数会导致任务无法启动或触发语法报错。
5位
Linux Crontab
分 时 日 月 周
这是 Linux 系统(如 Ubuntu/CentOS)自带的 Cron 格式。最小精度是 分钟。不支持秒级触发。
6位
Quartz / Spring
秒 分 时 日 月 周
常用于 Java 应用(Spring Task)。第一位是 秒。适合需要精确到秒的业务场景。
7位
Full Format
秒 分 时 日 月 周 年
Quartz 的完整格式。最后一位是 年份。可以指定任务在 2026 年特定的某天执行。
Question Mark (?)
日与周的互斥
在 6 位或 7 位 Cron 中,“日” 和 “周” 不能同时指定值。如果你指定了其中一个,另一个必须用 ?。
注:Linux 标准 5 位 Cron 不支持 ?,只能用 *。
Deployment Checklist / 避坑清单
路径必须是“绝对”的
Cron 运行时的当前目录是不确定的。脚本内的文件路径、可执行文件(如 /usr/local/bin/python3)请务必写全。
环境变量缺失
Cron 不会加载你的 .zshrc 或 .bash_profile。如果需要 Java 环境,请在脚本开头 export JAVA_HOME。
百分比符号 (%) 逃逸与日志
在 Linux Crontab 中,% 意味着换行。如果你在执行 date +%Y,必须转义为 \%Y。
此外,务必通过 >> /tmp/cron.log 2>&1 捕获错误,否则任务静默失败时你将无从排查。
#LoggingStrategy
#EscapeCharacters
多平台字段对照 Platform Comparison
| 字段 | 秒 | 分/时/日/月 | 周 (Day of Week) | 年 |
|---|---|---|---|---|
| Linux Cron | ❌ 不支持 | 1-12 / 1-31 | 0-7 (0/7=周日) | ❌ 不支持 |
| Spring Cron | 0-59 (第1位) | 支持 ? 互斥 | 0-7 (0/7=周日) | ❌ 不支持 |
| Quartz (Java) | 0-59 (第1位) | 支持 L, W, ? | 1-7 (1=周日) | 1970-2099 (选填) |
非标准字符 (Quartz/Spring)
?
问号 (Question Mark): 用于解除“日”与“周”的冲突。在 Java 实现中,这两个字段必须有一个为 ?,表示不指定。
L
最后 (Last): L 在日字段指月底;在周字段(如 5L)指本月最后一个周五。
#
第 N 个 (N-th): 仅周字段有效。5#3 表示每个月的第 3 个周五。
月末执行方案 (Java)
Quartz 方式 (原生支持 L)
@Scheduled(cron = "0 0 18 L * ?")
Spring 方式 (逻辑判定)
@Scheduled(cron = "0 0 18 28-31 * ?")
// 方法内判断: if (today == lastDayOfMonth) ...
// 方法内判断: if (today == lastDayOfMonth) ...
Crontab Cheat Sheet / 常用实例
0 0 L * * *
每月最后一天 0点 (Quartz)0 0 */3 * *
每隔 3 天 0点执行*/15 * * * *
每隔 15 分钟执行一次0 3 * * *
每天凌晨 3:00 执行30 8 * * 7
每周日 8点30分执行0 0 * * 1,5
每周一及周五 0点整执行0 14 12 5 *
每年 5月12日 14点执行*/15 18-23 * * *
晚18-23点每15分钟