Cron 表达式生成与解析器

可视化配置、逆向解析与校验 Cron 定时调度表达式。兼容 POSIX Crontab 与 Quartz/Spring 规范,支持多时区触发预测与跨平台工程配置导出。

Cron 调度表达式语法正确

支持输入任意表达式反向翻译,或通过下方可视化积木交互配置

自然语言释义 (Human Readable)

每隔 15 分钟执行一次

字段逐项拆解 (点击切换配置)格式规则: 分 时 日 月 周

配置 [分钟] 字段规则

当前值:*/15
从第分开始,每隔分执行一次

未来执行时间预测

基于当前时钟时间实时测算的未来 6 次触发节点

#13 分钟后
16:15:00
2026-10-07星期三
#218 分钟后
16:30:00
2026-10-07星期三
#333 分钟后
16:45:00
2026-10-07星期三
#448 分钟后
17:00:00
2026-10-07星期三
#51 小时 3 分钟后
17:15:00
2026-10-07星期三
#61 小时 18 分钟后
17:30:00
2026-10-07星期三

常用预设调度模板库

一键套用业界常见的定时任务调度表达式

多语言集成与部署代码

一键生成 Linux Crontab、GitHub Actions、Node.js 与 Spring 代码

Linux Crontab
# Run in terminal: crontab -e
*/15 * * * * /usr/bin/python3 /opt/scripts/backup.py >> /var/log/cron-job.log 2>&1

如何使用 Cron 表达式生成与解析器

  1. 选择目标运行环境规范: 根据运行架构切换标准 Linux Crontab (5 位: 分 时 日 月 周) 或 Spring Boot/Quartz (6 位包含秒级精度)。
  2. 配置离散数值或连续周期: 通过上方字段分栏选择循环步长、连续区间或点选具体时间数字;亦可在输入框中直接粘贴已有表达式反向解析。
  3. 核对确定性自然语言翻译: 查阅语义解析卡片,确保生成的表达式与业务预期的执行周期完全吻合,避免出现逻辑歧义。
  4. 校验未来触发时间时序: 核对未来 6 次实际执行时间戳(可切换本地时间与 UTC 时区),防范跨时区或夏令时边界错误。
  5. 导出生产部署配置代码: 一键复制标准 Linux Crontab、Kubernetes CronJob、Systemd Timer 或各主流后端语言的标准工程实现代码。

主流 Cron 调度方言规范对比

不同调度引擎在字段顺位、秒级支持、星期序号映射以及日期/星期冲突处理上存在显著技术差异,若混用会导致任务在生产环境偏移或拒绝解析:

调度方言 / 引擎字段结构秒级支持星期日编号日期 / 星期判定逻辑典型应用生态
POSIX / Linux Crontab5 位 (分 时 日 月 周)不支持 (最小粒度 1 分钟)0 = 周日,6 = 周六 (7 亦表示周日)两者均非 * 时呈现逻辑或 (OR)cron, cronie, busybox, crond, 系统定时任务
Spring Boot (@Scheduled)6 位 (秒 分 时 日 月 周)支持 (秒级精度)0 或 7 = 周日,1 = 周一 ... 6 = 周六支持 ? 字符消除逻辑冲突Spring Framework, Micronaut, Quarkus
Quartz Scheduler6~7 位 (秒 分 时 日 月 周 [年])支持 (秒级精度)1 = 周日,2 = 周一 ... 7 = 周六日与周必须有一方显式指定为 ?Java Quartz, Apache Camel, Camunda 工作流
AWS EventBridge / CloudWatch6 位 (分 时 日 月 周 年)不支持1 = 周日,2 = 周一 ... 7 = 周六强制要求日或周有一项为 ?AWS Lambda 定时触发器, EventBridge 规则
Kubernetes CronJob5 位 (分 时 日 月 周)不支持0~7 均支持 (遵循 POSIX 规范)遵循 POSIX 逻辑或 (OR) 判定Kube-controller-manager, k8s batch/v1

Cron 时间字段顺位与解析约束

Cron 表达式自左向右对各时间单元进行掩码匹配。调度守护进程在宿主机时钟同时满足所有字段约束的瞬间触发命令派发:

字段顺位字段名称有效数值区间支持的操作符典型示例底层求值行为
第 1 位 (Quartz/Spring)秒数 (Second)0 – 59* , - /*/10秒级触发偏移。Linux POSIX Crontab 无此位置。
第 1 位 (POSIX) / 第 2 位分钟 (Minute)0 – 59* , - /0,15,30,45整点内的分钟偏移,为传统 Linux 定时任务的最小调度颗粒度。
第 2 位 (POSIX) / 第 3 位小时 (Hour)0 – 23* , - /2-424 小时制天内时间。0 点代表午夜,23 点代表夜间 11 点。
第 3 位 (POSIX) / 第 4 位日期 (Day of Month)1 – 31* , - / ? L WL公历自然日,受当月实际天数(28~31)限制。与星期字段遵循 OR 规则。
第 4 位 (POSIX) / 第 5 位月份 (Month)1 – 12 / JAN – DEC* , - /*/3自然月份。英文缩写不区分大小写,部分底层系统不支持缩写区间。
第 5 位 (POSIX) / 第 6 位星期 (Day of Week)0 – 7 / SUN – SAT* , - / ? L #1-5周内循环周期。POSIX 规范中 0 与 7 均指周日;Quartz 中 1 指周日。

Cron 操作符语法语义与求值算法

*

通配符 (Wildcard)

匹配指定时间字段允许取值范围内的所有整数值。

典型示例: 在小时字段配置 *,代表全天 24 个整点均满足执行条件。
/

等差步长 (Step Interval)

以基准值为起点,按照指定差值周期性递增触发(base/step 结构)。

典型示例: 分钟字段 */15 在 0, 15, 30, 45 分触发;5/20 在 5, 25, 45 分触发。
,

离散枚举列表 (Discrete Set)

显式合并多个不连续的具体数值为一个非周期性触发集合。

典型示例: 日期字段配置 1,15,仅在每月 1 号和 15 号当天触发。
-

连续区间 (Continuous Range)

定义一段包含起始与终止边界的双闭合区间 [start, end]。

典型示例: 小时字段 9-17,代表在 09:00 至 17:00 之间的每个整点持续触发。
?

无指定占位符 (Unconstrained)

用于 Quartz 与 AWS 规范,当日期或星期某一方不设约束时用于消除冲突。

典型示例: 0 0 12 ? * MON-FRI 在工作日中午 12:00 触发,不锁定自然日。
L

末尾修饰符 (Last Day)

动态指定当月最后一天,或某星期的最后一个指定日(如 5L 表示最后周五)。

典型示例: 日期字段配置 L,在不同月份自适应匹配 28、29、30 或 31 日。
W

最近工作日 (Nearest Weekday)

将执行时机自动吸附到距离指定公历日期最近的周一至周五工作日。

典型示例: 15W 若 15 号为周六则提前至周五 14 号执行,若为周日则顺延至周一 16 号。
#

第 N 个特定星期 (Nth Weekday)

指定自然月中第几次出现的特定星期(结构为 星期#第几次)。

典型示例: 5#3 明确锁定自然月中的第 3 个星期五。

生产环境常见故障模式与工程防御方案

1. 日期与星期的“逻辑或 (OR)”陷阱

POSIX IEEE 1003.1

在 POSIX Crontab 标准中,当“日期”与“星期”均非通配符时,系统采用 逻辑或 (OR) 判定。表达式 0 2 15 * 5 并不是“15 号的周五”,而是在每月 15 号当天触发,并在全月的每个周五均触发。

# 在 Linux 中实现严格“且 (AND)”逻辑的标准写法:
0 2 15 * * [ $(date +\%u) -eq 5 ] && /opt/scripts/job.sh

2. 夏令时 (DST) 时钟跳变与漏跑

物理时钟漂移

在采用夏令时的地区,春季时钟由 02:00 直接跳变至 03:00,导致设定在 02:00~02:59 期间的 cron 任务被彻底跳过漏跑;秋季时钟回拨则导致 01:00~01:59 的任务重复派发。

# 规避方案:生产服务器与容器环境底层全量统一为 UTC:
timedatectl set-timezone UTC

3. 任务超时堆叠与并发踩踏

并发踩踏事故

Cron 守护进程仅负责按时派发命令,不感知历史进程的运行状态。若周期为 1 分钟的任务因数据库慢查询阻塞运行了 90 秒,次分钟的新进程将并行启动,导致资源竞争加剧甚至系统 OOM 崩溃。

# 利用 util-linux 的 flock 实现非阻塞互斥文件锁:
* * * * * /usr/bin/flock -n /var/lock/worker.lock /usr/bin/worker

4. 非整除步长的时间截断异常

边界取模异常

步长符号并非绝对平滑滑动时钟。在分钟字段中配置 */7,取模匹配点为 0, 7, 14, 21, 28, 35, 42, 49, 56。进入下一小时后分钟归零,导致第 56 分到下小时第 0 分之间只间隔了 4 分钟。

# 若需精确跨小时等长间隔,建议使用 systemd 定时器:
OnUnitActiveSec=7m

生产调度架构技术选型

调度体系时间精度并发重叠抑制停机补跑策略日志与可观测性时区处理机制
Linux Vixie / cronie1 分钟原生不支持 (需依赖 flock 互斥文件锁)宕机期间任务彻底忽略系统日志 (/var/log/cron 或 journald)绑定系统物理时钟 (/etc/localtime)
Systemd Timers1 微秒原生支持 (Type=oneshot 自动排队阻断)Persistent=true 支持开机后补跑journalctl -u 服务单元名支持在单元中指定时区指令
Kubernetes CronJob1 分钟concurrencyPolicy (Allow / Forbid / Replace)startingDeadlineSeconds 判定超时补跑kubectl logs pod-namespec.timeZone 声明 (k8s 1.27+ 默认 UTC)
AWS EventBridge1 分钟云端目标限流与死信队列重试自带指数退避与事件持久化重试CloudWatch Metrics & Logs强制固定为 UTC 零时区标准

高频实用 Cron 调度表达式速查表

运维层级调度周期意图Cron 表达式适配规范实际执行特征
高频遥测与心跳每 10 秒执行一次*/10 * * * * ?Quartz (6 位)用于微服务探针心跳、近实时指标采样或缓存预热。
队列清洗与轮询每 5 分钟执行一次*/5 * * * *POSIX (5 位)在每小时的 0, 5, 10, 15, 20...55 分启动。
整点指标汇聚每小时整点 (xx:00:00)0 * * * *POSIX (5 位)在每个小时的第 0 分钟触发一次,适用于小时级汇总日志。
夜间冷备与维护每天凌晨 02:000 2 * * *POSIX (5 位)数据库离线全量备份、WAL 归档与历史表 VACUUM 清理窗口。
办公业务工作日周一至周五早 09:000 9 * * 1-5POSIX (5 位)仅在工作日触发,周末两天自动休眠跳过。
周末系统重构每周日午夜 00:000 0 * * 0POSIX (5 位)周度账单出账、数据库主键碎片整理与周度报表归档。
月结账单清算每月 1 号午夜 00:000 0 1 * *POSIX (5 位)在每个公历月份第 1 天的 00:00 启动月度计费流程。
季度财务结转1、4、7、10 月首日 00:000 0 1 1,4,7,10 *POSIX (5 位)适用于季度财务报表归集、税务申报数据同步等低频任务。

生产环境部署配置与多语言集成代码

1. Linux Crontab (/etc/cron.d 或 crontab -e)
# 显式声明 PATH 环境变量,结合 flock 文件锁与 stdout/stderr 联合重定向
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

0 2 * * * /usr/bin/flock -n /var/lock/db_backup.lock /opt/scripts/backup.sh >> /var/log/backup.log 2>&1
2. Kubernetes CronJob (batch/v1)
apiVersion: batch/v1
kind: CronJob
metadata:
  name: telemetry-sync
spec:
  schedule: "*/15 * * * *"
  concurrencyPolicy: Forbid
  successfulJobsHistoryLimit: 3
  failedJobsHistoryLimit: 1
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: sync-worker
            image: registry.example.com/worker:v1.4
          restartPolicy: OnFailure
3. Node.js (node-cron 绑定显式时区)
import cron from 'node-cron';

// 显式指定 IANA 标准时区,规避宿主机本地时钟偏移影响
cron.schedule('0 9 * * 1-5', () => {
  console.log('执行工作日早间业务批处理任务');
}, {
  scheduled: true,
  timezone: 'Asia/Shanghai'
});
4. Python (croniter 计算未来触发时序)
from datetime import datetime, timezone
from croniter import croniter

base_time = datetime.now(timezone.utc)
iter = croniter('0 2 * * *', base_time)

# 计算并打印接下来的三次执行时间点
for _ in range(3):
    next_run = iter.get_next(datetime)
    print(f"预计下一次 UTC 执行时刻: {next_run.isoformat()}")
5. Go (robfig/cron/v3 标准解析调度)
package main

import (
    "fmt"
    "github.com/robfig/cron/v3"
)

func main() {
    // 使用默认 5 位标准解析器(不含秒)
    c := cron.New()
    _, err := c.AddFunc("0 0 1 * *", func() {
        fmt.Println("启动月度财务账单对账批处理")
    })
    if err != nil {
        panic(err)
    }
    c.Start()
    select {}
}
6. Java Spring Boot (@Scheduled)
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class ScheduledTasks {

    // Spring 6 位规范:秒 分 时 日 月 周
    @Scheduled(cron = "0 0 2 * * ?", zone = "Asia/Shanghai")
    public void executeNightlyBatch() {
        // 核心批处理逻辑
    }
}

常见问题解答

标准 5 位 Crontab 与 Java Spring/Quartz 6 位的关键区别是什么?

标准 Linux Crontab 由 5 个字段组成,以“分钟”为起始(范围 0-59),最小调度间隔为 1 分钟。Spring Boot 与 Quartz 规范在最前端增加了“秒”字段(范围 0-59),支持秒级调度。此外,Quartz 强制要求在“日期”与“星期”中,必须有一方使用问号 (?) 来表达无明确限制,以避免两者产生排他性逻辑冲突。

为什么表达式 "0 2 15 * 5" 会在不是周五的 15 号执行?

根据 POSIX IEEE 1003.1 规范,当“日期”与“星期”字段均非通配符 (*) 时,调度程序判定为逻辑或 (OR) 关系而非逻辑与 (AND)。该任务在每月的 15 号当天触发,且在全月的每个周五同样触发。若需在 Linux 中严格实现“既是 15 号又是周五”,应将星期设为 * 并在 Shell 命令中增加防御性判断:0 2 15 * * [ $(date +\%u) -eq 5 ] && /opt/scripts/job.sh。

当定时任务耗时超过执行周期时,如何防止进程并发堆叠引发故障?

传统 crond 守护进程只按时钟派发任务,不监测上一实例是否完工。若每分钟执行的任务因数据库阻塞耗时 90 秒,会连续启动新进程导致连接池耗尽或系统 OOM。在 Linux 物理机/容器中,应使用 util-linux 的 flock 工具加持非阻塞文件互斥锁:* * * * * /usr/bin/flock -n /var/lock/myjob.lock /opt/scripts/myjob.sh;在 Kubernetes 中需在 spec 声明 concurrencyPolicy: Forbid。

步长语法 */N 在时间字段上限无法整除时会出现什么异常?

步长计算是在字段取值区间内通过取模递增计算。以分钟字段配置 */7 为例,触发时间为 0, 7, 14, 21, 28, 35, 42, 49, 56 分。当跨入下一个小时时,分钟字段重置为 0,导致从 56 分到下一小时 0 分之间只间隔 4 分钟而非 7 分钟。若需严格跨小时固定等长间隔,建议使用 systemd 计时器的 OnUnitActiveSec=7m 指令。

在不支持 L 符号的标准 5 位 Crontab 中,如何实现“当月最后一天”执行?

标准 POSIX Crontab 原生不识别 L 标记。可以通过在 28-31 日每天检测明天是否为下月 1 号的方式精确命中月末最后一天:59 23 28-31 * * [ $(date -d tomorrow +\%d) -eq 1 ] && /usr/local/bin/month_end.sh。

Cron 任务是以本地时间还是 UTC 时间运行的?夏令时(DST)会有何影响?

物理机 Linux 系统依据 /etc/localtime 本地时区派发。当遭遇夏令时春季调快(02:00 直接跳至 03:00)时,配置在 02:00-02:59 期间的 cron 任务将被 Vixie cron 彻底跳过;秋季调慢时则会触发两次。现代化云基础设施(Kubernetes、AWS EventBridge、GitHub Actions)均统一强制采用 UTC 时区以杜绝时钟漂移。

为什么 Crontab 任务经常在终端运行正常,但在定时器中静默失败?

Crontab 执行时仅提供极其精简的 POSIX Shell 初始环境,不会加载用户的 ~/.bashrc 或 ~/.zshrc,默认 PATH 仅包含 /usr/bin:/bin。生产实践中应始终在脚本中写绝对二进制路径(如 /usr/bin/node 而非 node),并在 crontab 首行显式声明 PATH,同时将 stdout 与 stderr 重定向至日志:>> /var/log/myjob.log 2>&1。

生产环境中何时应该优先选用 Systemd Timers 替代 Crontab?

当遇到需要微秒级精度、单次执行完工后再计时(OnUnitActiveSec,彻底消除并发堆叠)、系统关机开机后自动补跑遗漏任务(Persistent=true)、利用 cgroups 限制任务内存/CPU 配额,或者依赖 journalctl 进行集中化结构化日志追踪时,应全面优先选用 Systemd Timers。