Cron 表达式解析器

将 cron 表达式解析为人类可读的描述并预览下一个运行时间

加载示例

Cron 表达式

minute hour day(month) month day(week)

人类可读的描述

At 9:00 AM, Mon, Tue, Wed, Thu, Fri

字段说明

Minute

0

0–59

Hour

9

0–23

Day (month)

*

1–31

Month

*

1–12

Day (week)

1-5

0–6

接下来 10 次计划运行

12026-03-26 09:00:00
22026-03-27 09:00:00
32026-03-30 09:00:00
42026-03-31 09:00:00
52026-04-01 09:00:00
62026-04-02 09:00:00
72026-04-03 09:00:00
82026-04-06 09:00:00
92026-04-07 09:00:00
102026-04-08 09:00:00

什么是 Cron 表达式解析?

cron 表达式是由五个空格分隔字段组成的字符串,用于定义周期性任务计划。该格式起源于 Unix cron 守护进程,由 Ken Thompson 于 1979 年为 Version 7 Unix 编写。每个字段代表一个时间单位:分钟、小时、月份中的日期、月份和星期几。解析 cron 表达式意味着将这种紧凑的符号转换为人类可读的描述和一份具体的即将执行时间列表。

标准五字段格式被 Linux 和 macOS 上的 crontab、GitHub Actions 和 GitLab CI 等 CI/CD 平台、AWS(EventBridge)、Google Cloud Scheduler 和 Azure Functions 中的云调度器,以及各主流编程语言的任务调度库所使用。部分系统通过添加秒字段或年份字段将格式扩展为六或七个字段,但 POSIX 定义的五字段布局仍是所有实现共同遵循的基准。

手动解析 cron 表达式容易出错。字段之间的交互会产生不直观的计划:`0 9 1-7 * 1` 并不表示“每月第一周的每个周一”,而是“每月 1 日至 7 日,或任意周一”。cron 解析器通过展开每个字段、应用组合规则并生成任务实际触发的时间戳来消除这种歧义。

为什么使用这个 Cron 解析器?

从配置文件中读取像 `30 */6 1,15 * *` 这样的 cron 表达式并准确知道它何时触发,需要对五个字段进行心算。本解析器即刻完成这项工作。

即时解析
输入或粘贴 cron 表达式,立即查看人类可读的描述和接下来 10 次计划执行时间。无需提交按钮,无需刷新页面。
🔒
隐私优先处理
所有解析均在浏览器本地运行。您的 cron 表达式和计划数据不会离开您的设备。
📋
逐字段分解
五个字段中的每一个都会被单独解析和显示,展示解析后的值。一眼即可看出哪个字段控制着计划。
🔄
无需账号
打开页面即可开始解析。无需登录、无需 API 密钥、无需安装。在任何支持现代浏览器的设备上均可使用。

Cron 解析器使用场景

前端开发者
在将 cron 表达式发送到后端之前,验证管理后台和调度 UI 中的表达式是否正确。确认用户在下拉菜单中选择的计划与表单生成的 cron 字符串一致。
后端工程师
调试在意外时间触发的定时任务。粘贴任务队列配置(Celery、Sidekiq、Quartz)中的 cron 表达式,检查下次运行时间是否符合预期。
DevOps / SRE
审查 CI/CD 管道、Kubernetes CronJob 和云调度器配置中的 cron 计划。在部署前验证备份任务、证书续期和清理脚本的定时设置是否正确。
QA 工程师
验证测试环境中的定时任务与生产计划一致。在上线前发现月份或星期几字段中的偏差错误,避免生产环境中出现遗漏运行。
数据工程师
检查 ETL 管道和数据同步任务的 cron 触发器。确认提取时间窗口不重叠,并且下游依赖项有足够的准备时间。
学习者
通过实验不同的表达式并实时查看结果来学习 cron 语法。直观感受通配符、范围和步长值之间的交互方式。

Cron 表达式语法参考

标准 cron 表达式有五个空格分隔的字段。每个字段支持整数、通配符、范围、列表和步长值。下表展示了每个字段的允许范围和运算符。

字段范围运算符说明
Minute0–59* , - /Minute within the hour
Hour0–23* , - /Hour of the day (24-hour)
Day (month)1–31* , - /Day of the month
Month1–12* , - /Month of the year (or JAN–DEC)
Day (week)0–6* , - /Day of the week (0 = Sunday, or SUN–SAT)

四个特殊字符控制每个字段中值的匹配方式:

字符名称行为
*WildcardMatches every possible value in the field. * in the minute field means "every minute."
,ListSeparates individual values. 1,15 in the day field means "the 1st and 15th."
-RangeDefines an inclusive range. 1-5 in the day-of-week field means "Monday through Friday."
/StepDefines an interval. */10 in the minute field means "every 10 minutes." 5/15 means "5, 20, 35, 50."

以下是覆盖大多数调度需求的常用 cron 表达式:

表达式计划说明
* * * * *Every minute
0 * * * *Every hour (at minute 0)
*/15 * * * *Every 15 minutes
0 9 * * *Every day at 9:00 AM
0 9 * * 1-5Weekdays at 9:00 AM
30 2 * * 0Every Sunday at 2:30 AM
0 0 1 * *First day of every month at midnight
0 0 * * 1Every Monday at midnight
0 0 1 1 *January 1st at midnight (yearly)
0 */6 * * *Every 6 hours
5,35 * * * *At minute 5 and 35 of every hour
0 9-17 * * 1-5Every hour from 9 AM to 5 PM, weekdays

代码示例

如何在常用编程语言中解析 cron 表达式并计算下次运行时间:

JavaScript (Node.js)
import cronstrue from 'cronstrue';

// Parse cron to human-readable text
cronstrue.toString('0 9 * * 1-5');
// → "At 09:00 AM, Monday through Friday"

cronstrue.toString('*/15 * * * *');
// → "Every 15 minutes"

// Validate with cron-parser and get next run times
import { parseExpression } from 'cron-parser';

const interval = parseExpression('30 2 * * 0');
console.log(interval.next().toISOString());
// → next Sunday at 02:30 UTC

// Iterate over the next 5 runs
for (let i = 0; i < 5; i++) {
  console.log(interval.next().toString());
}
Python
from crontab import CronTab
from croniter import croniter
from datetime import datetime

# Parse and describe a cron expression
cron = CronTab('0 9 * * 1-5')
print(cron.next(default_utc=True))
# → seconds until next run

# Get the next 5 run times with croniter
base = datetime.now()
cron_iter = croniter('0 9 * * 1-5', base)
for _ in range(5):
    print(cron_iter.get_next(datetime))
# → next 5 weekday 09:00 timestamps

# Check if a specific time matches
print(croniter.match('*/15 * * * *', datetime(2026, 3, 25, 10, 30)))
# → True (minute 30 is divisible by 15)
Go
package main

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

func main() {
    // Parse a standard 5-field cron expression
    parser := cron.NewParser(cron.Minute | cron.Hour | cron.Dom | cron.Month | cron.Dow)
    schedule, err := parser.Parse("0 9 * * 1-5")
    if err != nil {
        panic(err)
    }

    // Calculate the next 5 run times
    now := time.Now()
    for i := 0; i < 5; i++ {
        now = schedule.Next(now)
        fmt.Println(now)
    }
    // → next 5 weekday 09:00 timestamps
}
Bash (crontab)
# List current user's cron jobs
crontab -l

# Edit cron jobs interactively
crontab -e

# Add a job: run backup.sh every day at 2:30 AM
# (append to crontab via pipe)
(crontab -l 2>/dev/null; echo "30 2 * * * /home/user/backup.sh") | crontab -

# Check syntax with a dry-run parse (requires cronie or busybox)
# The system will reject invalid expressions when saving

# View cron logs on systemd-based Linux
journalctl -u cron --since "1 hour ago"

常见问题

5 字段和 6 字段 cron 表达式有什么区别?
标准(POSIX)cron 格式有 5 个字段:分钟、小时、月份中的日期、月份、星期几。Quartz Scheduler 和 Spring 等工具在开头添加了秒字段,使其变为 6 个字段。AWS EventBridge 在末尾添加了年份字段,同样是 6 个字段。本解析器支持标准 5 字段格式,与 crontab、GitHub Actions、Kubernetes CronJob 和大多数调度库兼容。
cron 如何同时处理月份中的日期和星期几?
当两个字段均有限制(非 *)时,cron 使用 OR 逻辑:满足任意一个条件时任务就会运行。例如,`0 9 15 * 1` 表示“每月 15 日上午 9:00 或每个周一上午 9:00”。这是常见的混淆来源。如果两个字段均设置为 *,则任务每天运行。
cron 使用哪个时区?
传统 crontab 在系统本地时区运行。Kubernetes CronJob 默认使用 kube-controller-manager 的时区(通常为 UTC),但自 Kubernetes 1.25 起支持可选的 `.spec.timeZone` 字段。AWS EventBridge 和 Google Cloud Scheduler 允许按计划指定时区。在部署 cron 任务前,务必确认调度器使用的时区。
cron 能否每 30 秒运行一次任务?
标准 5 字段 cron 不支持亚分钟级调度,最小间隔为 1 分钟(`*/1` 或 `*`)。若要每 30 秒运行一次,需要使用带秒字段的 6 字段 cron(Quartz、Spring)、休眠 30 秒后再次运行的包装脚本,或其他调度机制(如使用 OnCalendar 的 systemd 定时器)。
星期几字段中 0 和 7 是否相同?
在大多数 cron 实现中,0 和 7 都表示周日。这一惯例来自最初的 Unix cron。但某些系统(如 Quartz)使用 1 表示周日、7 表示周六。POSIX 将范围定义为 0-6,其中 0 = 周日。如果您的调度器支持命名星期(SUN、MON),建议使用命名方式以避免歧义。
如果设置了不存在的月份日期会怎样?
如果将任务计划在每月 31 日(`0 0 31 * *`),它不会在不足 31 天的月份中运行。cron 不会顺延到下个月。2 月始终会被跳过,4 月、6 月、9 月和 11 月也会被跳过。若要在每月最后一天运行,部分 cron 实现支持 L 修饰符(`0 0 L * *`),但标准 POSIX cron 不支持。
如何在部署前测试 cron 表达式?
使用本工具等在线解析器查看下次运行时间,验证计划是否符合预期。对于生产验证,大多数 cron 库提供了下次运行计算函数:Node.js 中的 cron-parser、Python 中的 croniter、Go 中的 robfig/cron。在测试套件中通过这些函数运行表达式,在部署前断言接下来 N 次执行时间是否正确。