如何编写每年指定天数的Cron表达式?例如第44/256天
正确的Cron表达式写法(按场景区分)
1. 支持“年的第几天”的Cron变种(如Quartz、Spring Task等)
标准Linux crontab的5字段格式不支持直接指定“年的第几天”,但很多扩展Cron实现(比如Quartz、Spring的@Scheduled)支持7字段格式(秒 分 时 日 月 周 年),并且允许将“日”字段作为“年的第几天”使用(需将“月”设为*,“周”设为?避免规则冲突)。
示例:
- 每年第44天的0点0分0秒执行:
0 0 0 44 * ? - 每年第256天的0点0分0秒执行:
0 0 0 256 * ?
注:?表示不指定星期几,用来规避“日”和“周”字段的规则冲突。
2. 标准Linux Crontab(5字段格式)
标准Cron没有“年的第几天”字段,无法直接实现,可通过以下两种方式解决:
方式一:计算对应日期,编写多组表达式
先算出目标天数在平年、闰年对应的月/日,将所有可能的日期写入Cron。
比如第256天:
- 平年对应9月13日,表达式:
0 0 13 9 * - 闰年对应9月12日,表达式:
0 0 12 9 *
将这两个表达式都加入crontab,即可覆盖平闰年的触发需求(非闰年时9月12日不会是第256天,但Cron无法区分闰年,只能接受这个小瑕疵)。
方式二:通过脚本判断后执行
更可靠的方式是编写Shell脚本,先判断当天是否为目标天数,再执行任务,最后用Cron每天触发脚本。
示例脚本(以判断第44天为例):
#!/bin/bash target_day=44 current_day=$(date +%j) if [ "$current_day" -eq "$target_day" ]; then # 此处填写要执行的任务命令 echo "执行指定任务" fi
给脚本添加执行权限:chmod +x check_day.sh,再在crontab中添加每天0点触发:
0 0 * * * /path/to/check_day.sh
原表达式不生效的原因
你写的0 0 44 * *中,第三个字段是“每月的几号”,而非“年的第几天”。每月最多只有31天,44号不存在,因此该表达式永远不会触发任务。
内容的提问来源于stack exchange,提问作者pejoran
相关产品推荐
相关产品推荐

