Cron 表达式验证器

验证 cron 表达式并查看详细的逐字段分解

加载示例

Cron 表达式

minute hour day(month) month day(week)

有效的 cron 表达式

字段说明

Minute*/15(0–59)

展开为: 0, 15, 30, 45

Hour0-6(0–23)

展开为: 0, 1, 2, 3, 4, 5, 6

Day of month1,15(1–31)

展开为: 1, 15

Month*(1–12)

展开为: all (1–12)

Day of week1-5(0–6)

展开为: 1, 2, 3, 4, 5

什么是 Cron 表达式验证?

Cron 表达式验证是指在表达式送入调度器之前,检查其是否符合正确语法规则的过程。Cron 表达式由五个空格分隔的字段组成(分钟、小时、月份中的日期、月份、星期几),用于定义周期性计划。如果任意字段包含超出范围的值、无效运算符,或字段数量不对等结构性错误,该表达式要么在部署时被调度器拒绝,要么静默失效、永不触发。

在线验证 cron 表达式比部署到生产环境后等待任务遗漏更早发现错误。常见错误包括:在小时字段写 25(有效范围为 0-23)、使用步长为零(*/0,未定义行为)、反转范围边界(5-1 而非 1-5),或添加属于非标准格式(如 Quartz)的额外字段。语法检查器能即刻标记这些问题,并精确告知哪个字段有误。

Cron 验证与 cron 解析不同。解析器接受有效表达式并将其转换为人类可读的计划描述;验证器回答一个更简单的问题:这个表达式格式是否正确?应先验证再解析——将无效表达式送入调度器毫无意义。在 CI/CD 管道中,自动化 cron 验证可防止格式错误的计划被合并进配置文件。

为什么使用这个 Cron 验证器?

Cron 表达式有严格的语法规则,而各调度器在规则被破坏时给出的错误信息参差不齐。有些调度器抛出晦涩的错误,有些则静默接受、从不触发。本验证器在部署前为您提供清晰的逐字段诊断。

即时语法检查
粘贴或输入 cron 表达式,立即查看验证结果。无需提交表单,无需等待。结果随输入实时更新。
🔒
隐私优先处理
验证完全在浏览器本地运行。您的 cron 表达式和计划配置不会发送到服务器,也不会存储在任何地方。
🔍
逐字段错误报告
当表达式无效时,验证器会指出是哪个字段导致错误以及原因。无需猜测五个字段中哪个有问题。
📋
无需账号
打开页面即可开始检查。无需登录、无需 API 密钥、无需安装。在任何支持现代浏览器的设备上均可使用,包括移动端。

Cron 验证器使用场景

前端开发者
在将用户在调度 UI 中输入的 cron 表达式保存到数据库之前进行验证。在客户端捕获语法错误,而不是等待后端拒绝。
后端工程师
在代码审查期间检查任务队列配置(Celery beat、Hangfire、Quartz)中的 cron 表达式。验证重构后的计划字符串仍能通过语法验证。
DevOps / SRE
在应用前验证 Kubernetes CronJob 配置清单和 CI/CD 管道配置中的 cron 计划。防止备份计划中的拼写错误在备份遗漏前一直被忽视。
QA 工程师
测试您的应用能否正确拒绝无效的 cron 输入。生成已知的错误表达式(超出范围的值、错误的字段数量)并确认错误处理逻辑正常工作。
数据工程师
验证 Airflow DAG 和 dbt 定时运行的 cron 触发器。在部署前确认从 YAML 或 JSON 配置文件中解析出的管道计划在语法上是正确的。
学习者
实验 cron 语法并即时获得反馈,了解什么是有效的、什么会导致错误。通过测试表达式并阅读错误信息来学习字段范围、运算符和边界情况。

常见 Cron 语法错误

下表列出了最常见的 cron 表达式错误及其原因。这些是在生产配置和 CI/CD 管道中反复出现的错误。

错误类型示例错误原因
Too few fields0 9 * *Missing the day-of-week field. Standard cron requires exactly 5 fields.
Too many fields0 0 9 * * 1 2026Extra fields. Some tools add seconds or year, but standard cron uses 5.
Value out of range0 25 * * *Hour field accepts 0-23. Value 25 exceeds the maximum.
Invalid step base0 0 32/2 * *Day-of-month starts at 32, which exceeds the 1-31 range.
Step of zero*/0 * * * *Step value must be 1 or greater. Zero creates an infinite loop.
Empty field0 9 * * 1Double space creates an empty field. Each field needs a value.
Invalid character0 9 * * Mon-FryTypo in day name. Use three-letter abbreviations: MON, TUE, WED, THU, FRI, SAT, SUN.
Reversed range0 9 * * 5-1Range end (1) is less than start (5). Write 1-5 or use a list: 5,6,0,1.

有效与无效的 Cron 表达式

有效表达式与常见错误的快速对照参考。在将表达式粘贴到调度器配置前用于自查。

有效表达式
* * * * *
0 9 * * 1-5
*/15 * * * *
0 0 1,15 * *
30 2 * * 0
0 */6 * * *
无效表达式
0 9 * *只有 4 个字段,需要 5 个
0 25 * * *小时最大值为 23
*/0 * * * *步长不能为 0
0 9 * * 8星期几最大值为 6
60 * * * *分钟最大值为 59
0 0 0 * *月份中的日期最小值为 1

代码示例

如何在 JavaScript、Python、Go 和 Bash 中以编程方式验证 cron 表达式。每个示例展示如何捕获无效语法并提取有意义的错误信息。

JavaScript (Node.js)
import { parseExpression } from 'cron-parser';

// Validate a cron expression by attempting to parse it
function validateCron(expr) {
  try {
    parseExpression(expr);
    return { valid: true, error: null };
  } catch (err) {
    return { valid: false, error: err.message };
  }
}

console.log(validateCron('0 9 * * 1-5'));
// → { valid: true, error: null }

console.log(validateCron('0 25 * * *'));
// → { valid: false, error: "Constraint error, got value 25 expected range 0-23" }

// Validate with field-level detail using cron-validator
import { isValidCron } from 'cron-validator';

isValidCron('*/15 * * * *');           // → true
isValidCron('*/15 * * * *', { seconds: true }); // → false (expects 6 fields)
isValidCron('0 0 31 2 *');             // → true (syntactically valid, Feb 31 never fires)
Python
from croniter import croniter

# Validate by checking if croniter can parse the expression
def validate_cron(expr: str) -> dict:
    if croniter.is_valid(expr):
        return {"valid": True, "error": None}
    # Get a more specific error message
    try:
        croniter(expr)
    except (ValueError, KeyError) as e:
        return {"valid": False, "error": str(e)}
    return {"valid": False, "error": "Unknown error"}

print(validate_cron("0 9 * * 1-5"))
# → {'valid': True, 'error': None}

print(validate_cron("0 25 * * *"))
# → {'valid': False, 'error': '...out of range...'}

print(validate_cron("* * *"))
# → {'valid': False, 'error': 'Exactly 5 or 6 columns...'}

# Field-level validation
from crontab import CronTab

cron = CronTab(tab="")
job = cron.new(command="/bin/true")
try:
    job.setall("0 9 * * 1-5")
    print(job.is_valid())  # → True
except Exception as e:
    print(f"Invalid: {e}")
Go
package main

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

// ValidateCron checks whether a 5-field cron expression is syntactically correct
func ValidateCron(expr string) (bool, error) {
    parser := cron.NewParser(
        cron.Minute | cron.Hour | cron.Dom | cron.Month | cron.Dow,
    )
    _, err := parser.Parse(expr)
    if err != nil {
        return false, err
    }
    return true, nil
}

func main() {
    exprs := []string{
        "0 9 * * 1-5",   // valid
        "0 25 * * *",    // invalid: hour 25
        "*/15 * * * *",  // valid
        "0 0 32 * *",    // invalid: day 32
    }

    for _, e := range exprs {
        ok, err := ValidateCron(e)
        if ok {
            fmt.Printf("%-20s  VALID
", e)
        } else {
            fmt.Printf("%-20s  INVALID: %v
", e, err)
        }
    }
}
Bash
#!/bin/bash

# Validate cron syntax using Python one-liner
validate_cron() {
  python3 -c "
from croniter import croniter
import sys
expr = sys.argv[1]
if croniter.is_valid(expr):
    print(f'VALID: {expr}')
    sys.exit(0)
else:
    print(f'INVALID: {expr}')
    sys.exit(1)
" "$1"
}

validate_cron "0 9 * * 1-5"     # → VALID: 0 9 * * 1-5
validate_cron "0 25 * * *"      # → INVALID: 0 25 * * *

# Quick regex pre-check (catches field count and obvious issues)
cron_regex='^([0-9*/,-]+\s+){4}[0-9*/,-]+$'
echo "*/5 * * * *" | grep -Eq "$cron_regex" && echo "passes basic check"
echo "* * *" | grep -Eq "$cron_regex" || echo "fails basic check"

常见问题

什么会导致 cron 表达式无效?
当 cron 表达式违反五字段格式的语法规则时即为无效。常见原因:字段数量错误(标准 cron 少于或多于 5 个字段)、值超出允许范围(如小时 25、分钟 60、月份中的日期 0)、步长为零(*/0)、范围边界反转(5-1),或包含无法识别的字符。表达式必须恰好有五个空格分隔的字段,每个字段包含有效的值和运算符。
一个永不触发的 cron 表达式是否有效?
从语法角度来说,是的。像 0 0 31 2 *(2 月 31 日)这样的表达式能通过语法验证,因为每个字段的值都在允许范围内。但它永远不会触发,因为 2 月从来没有 31 天。大多数验证器只检查语法,不检查语义正确性。如果需要捕获不可达的计划,可计算接下来 N 次运行时间并检查列表是否为空。
如何验证 6 字段或 7 字段的 cron 表达式?
标准 POSIX cron 使用 5 个字段。Quartz Scheduler 在开头添加了秒字段(6 个字段),并在末尾添加了可选的年份字段(7 个字段)。AWS EventBridge 使用 6 个字段。本验证器检查标准 5 字段格式。若要验证 Quartz 或 EventBridge 表达式,请使用支持扩展格式的库,例如 Node.js 中启用 extended 选项的 cron-parser,或 Java 中的 quartz-cron。
cron 表达式中可以使用命名的星期和月份吗?
大多数 cron 实现接受月份(JAN-DEC)和星期几(SUN-SAT)的三字母英文缩写。这些在 crontab 中不区分大小写,但在其他系统中可能区分大小写。命名值在所有平台上并不都能用于范围:MON-FRI 在 crontab 中有效,但在部分库中无效。如果需要跨平台兼容,建议使用数字值(1-5 表示周一到周五)。
为什么我的 cron 表达式在 crontab 中有效,但在 Kubernetes 中失败?
Kubernetes CronJob 使用与 crontab 相同的 5 字段格式,但由 Go cron 库解析,该库的验证更为严格。crontab 可以容忍的表达式(如末尾空格,或月份中的日期和星期几同时设为非通配符值)可能产生不同的行为。Kubernetes 默认使用 controller-manager 的时区(通常为 UTC),而非节点的本地时区。务必针对您实际部署的调度器验证表达式。
如何在 CI/CD 管道中验证 cron 表达式?
在部署前添加验证步骤。在 Node.js 项目中,可在测试文件中使用 cron-parser 或 cron-validator,读取配置中的 cron 字符串并断言其能无错误地解析。在 Python 中,使用 croniter.is_valid()。在 Shell 脚本中,调用验证函数并在失败时以非零退出码退出。这可以在拼写错误和复制粘贴错误到达生产环境之前将其捕获。
cron 验证和 cron 检查(linting)有什么区别?
验证检查表达式在语法上是否正确:字段数量是否正确、值是否在范围内、运算符是否有效。检查则更进一步,检查技术上有效但可能存在问题的情况:永不触发的计划(2 月 31 日)、重叠任务、跳过预期间隔的步长值(*/7 每小时重置),或没有时区说明的计划。验证回答的是"这个能解析吗",检查回答的是"这可能是你想要的吗"。