恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
Cron表达式实战:Unix Cron vs Quartz Cron vs Spring Cron三种格式差异全解析
首页
资讯中心
/
Cron表达式实战:Unix Cron vs Quartz Cron vs Spring Cron三种格式差异全解析
Cron表达式实战:Unix Cron vs Quartz Cron vs Spring Cron三种格式差异全解析
发布时间:2026/8/31 22:19:41
同样是每天 9:30 执行在 Linux crontab、Quartz 和 Spring Boot 里的写法各不相同。写错了不报错任务就是不对——这种 bug 最难查。本文用对照表和代码实例讲透三种 Cron 格式的差异。三种 Cron 的来历格式起源字段数典型场景Unix CronUnix cron 守护进程5 段Linux crontab、AWS EventBridgeQuartz CronQuartz Scheduler6-7 段Java 企业级调度框架Spring CronSpring Framework6 段Spring BootScheduled字段结构对比Unix: 分 时 日 月 周 Quartz: 秒 分 时 日 月 周 [年] Spring: 秒 分 时 日 月 周Quartz 和 Spring 比 Unix 多了秒字段最左边Quartz 还可选支持年字段最右边。差异对照表字段定义字段Unix CronQuartz CronSpring Cron秒无0-590-59分0-590-590-59时0-230-230-23日1-311-311-31月1-121-12 / JAN-DEC1-12 / JAN-DEC周0-61-70-6 / 1-7年无可选1970-2099无周字段编码差异这是最容易踩坑的地方值Unix CronQuartz CronSpring Cron0周日无效1-7周日1周一周日周一7无效0-6周六周日Unix Cron0周日1周一…6周六。Quartz Cron1周日2周一…7周六。Spring Cron0 和 7 都表示周日1周一…6周六。同样写1Unix 和 Spring 是周一Quartz 是周日。从 Quartz 迁移到 Spring 时周字段的数字全部要调整。特殊字符支持字符Unix CronQuartz CronSpring Cron*支持支持支持,支持支持支持-支持支持支持/支持支持支持?不需要必须用必须用L不支持支持支持W不支持支持支持#不支持支持支持英文缩写不支持支持 (MON-SUN)支持 (MON-SUN)宏不支持不支持支持 (daily 等)?的使用规则Unix Cron 不需要?日和周可以同时为*# Unix crontab — 合法* * * * *00* * *Quartz 和 Spring 必须用?日和周不能同时为*// Quartz/Spring — 合法000**?// 每天000?*MON// 每周一// Quartz/Spring — 非法会报错000***// 日和周不能同时为 *同一需求的三种写法每天 9:30 执行# Unix crontab309* * * /path/to/script.sh// QuartzTriggertriggerTriggerBuilder.newTrigger().withSchedule(CronScheduleBuilder.cronSchedule(0 30 9 * * ?)).build();// Spring BootScheduled(cron0 30 9 * * ?)publicvoidexecute(){}注意 Quartz 和 Spring 多了秒字段0表示第 0 秒。Unix 没有秒字段直接从分开始。工作日 9 点执行# Unix — 1-5 表示周一到周五09* *1-5 /path/to/script.sh// Quartz — 2-6 表示周一到周五1周日Scheduled(cron0 0 9 ? * MON-FRI)// Spring — MON-FRI 缩写或 1-5Scheduled(cron0 0 9 ? * MON-FRI)Quartz 周字段用数字时 2-6 才是周一到周五1周日。用英文缩写 MON-FRI 可以避免歧义推荐用缩写。每月最后一天执行# Unix — 不支持 L需要 shell 脚本判断0028-31 * *[$(date%d)$(date-d1 day%d)]/path/to/script.sh// Quartz/Spring — 直接用 LScheduled(cron0 0 0 L * ?)Unix Cron 不支持L只能在 28-31 号执行脚本脚本内判断明天是否是 1 号。Quartz 和 Spring 直接用L就行。Spring 宏表达式Spring 6.0 支持宏表达式简化常用配置// 宏等价写法Scheduled(cronhourly)// 等价于 0 0 * * * *Scheduled(crondaily)// 等价于 0 0 0 * * *Scheduled(cronweekly)// 等价于 0 0 0 * * 0Scheduled(cronmonthly)// 等价于 0 0 0 1 * *Scheduled(cronyearly)// 等价于 0 0 0 1 1 *宏表达式是 Spring 特有的Quartz 和 Unix Cron 不支持。使用宏时不需要考虑字段数和?规则简洁但灵活性有限。迁移注意事项从 Unix 迁移到 Spring前面补秒字段0日和周字段如果同时为*其中一个改成?周字段数字编码一致0周日无需调整从 Unix 迁移到 Quartz前面补秒字段0日和周字段同时为*时其中一个改成?周字段数字编码要调整Unix 的 0→Quartz 的 1Unix 的 1→Quartz 的 2以此类推推荐用英文缩写 MON-SUN 避免歧义从 Quartz 迁移到 Spring秒字段保留?规则一致周字段数字编码要调整Quartz 的 1→Spring 的 0Quartz 的 2→Spring 的 1以此类推推荐用英文缩写避免歧义在线验证迁移 Cron 表达式时需要确认转换后的表达式语义不变。可以在 盘子工具站 Cron 表达式工具 上做这种验证——工具支持 5 段和 6 段格式切换输入同一个表达式切换格式后观察字段含义提示的变化。比如输入0 30 9 * * ?6 段中文解释显示每天 9:30 执行切换到 5 段模式输入30 9 * * *确认解释一致。触发时间预览也能帮你验证——5 段和 6 段的触发时间应该完全相同。需要特别注意的是周字段的编码差异工具中周字段的取值范围提示0-6 还是 1-7会随格式切换自动更新帮你直观看到两种格式的区别。