悦省

Cron 表达式

写完不确定对不对?看接下来会跑在哪几个时间点最直观。

五段含义

分钟(0-59) 小时(0-23) 日(1-31) 月(1-12) 星期(0-7,0 和 7 都是周日)。不支持 @daily 这类宏和秒级字段(那是 Quartz 的六段式)。

什么时候用

  • 接手别人的 crontab 或 CI 定时配置,先确认 */15 9-18 * * 1-5 到底几点到几点跑、会不会跨午休、周末是否真不触发。
  • 改完表达式后核对接下来 8 次执行时间是否落在预期,尤其是 31 号、2 月、月末这种用肉眼很难推的边界。

什么时候不用

  • 要写 Quartz、Spring @Scheduled 的 6 段(秒在最前)或 AWS EventBridge 的 6 段表达式:字段含义与时区规则都不同,这里要求正好 5 段。
  • 要用 @daily、@reboot 宏,或 L、W、# 这类扩展,或指定 IANA 时区:都不支持,得查 crontab(5) 原文或改系统、调度器的时区设置。
限制与隐私

解析与推算在浏览器本地完成,用本机时区。限制:正好 5 段,仅支持数字、*、范围、列表与 /步长;不支持 JAN/MON、@daily 宏、L/W/#/? 与秒字段;日与星期同时限制按 AND(Vixie cron 为 OR)。

常见问题

用的是哪个时区?

浏览器本地时区,页面不会也不能替你换算服务器的时区。多数服务器的 crontab 跑在 UTC 或系统本地时区:VPS 常见 UTC,容器里几乎都是 UTC。同样的 0 9 * * * 在北京和 UTC 主机上差 8 小时。上线前用 date、timedatectl 确认目标机器的设置。夏令时切换时,被跳过的本地时间不会执行,重复的本地时间可能执行两次。

支持 @daily、@reboot 吗?支持 Quartz 的 ? 和秒字段吗?

都不支持。@daily 写成 0 0 * * *,@weekly 写成 0 0 * * 0;@reboot 依赖系统启动事件,表达式表达不了。Quartz 的 ?(不指定)、L(最后一天)、W(最近的工作日)、#(第几个星期几)以及秒字段属于另一套语法。本工具只解析 5 段,支持数字、*、范围、列表和 /步长,不认 JAN、MON 这类英文缩写。

同时限制「几号」和「星期几」会怎样?

本工具按 AND 计算:两个条件都满足才触发,所以 0 0 1 * 1 意思是「既是 1 号又是周一」,几年才遇到一次。标准 Vixie cron 是 OR:任一条件满足就触发。这是最容易踩的差异,排查「任务没跑」时经常卡在这。建议永远只限制其中一个,另一个写 *;需要更复杂的规则就交给调度器或代码判断。