You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写每年指定天数的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 02:55:21