Cron 表达式生成器

使用分步构建器可视化生成 cron 表达式

快速预设

分钟

小时

月份中的日期

月份

星期几

Cron 表达式

0 9 * * *

minute hour day(month) month day(week)

什么是 Cron 表达式生成器?

Cron 表达式生成器是一种通过可视化界面构建 cron 计划字符串的工具,无需手动编写。Cron 表达式由五个字段组成(分钟、小时、月份中的日期、月份、星期几),用于定义周期性任务的执行时间。该格式最早可追溯至 1979 年 Unix 原始 cron 守护进程,现广泛应用于 crontab、Kubernetes CronJob、GitHub Actions、AWS EventBridge、Google Cloud Scheduler 以及数十种任务调度库。

凭记忆编写 cron 表达式是常见的错误来源。五个字段之间存在不直观的交互:分钟字段中的步长值 */15 会在 0、15、30、45 分钟触发,而 5/15 则从第 5 分钟开始,依次在 5、20、35、50 分钟触发。将月份中的日期和星期几同时设为非通配符时,二者之间是 OR 关系而非 AND 关系,即使经验丰富的工程师也常因此感到困惑。可视化生成器通过让您直接选择所需计划并自动生成正确语法,消除了这种歧义。

Cron 生成器与 cron 解析器的功能相反。解析器接受已有的表达式并用自然语言解释其含义;生成器则反向工作:您描述所需的计划,工具输出对应的 cron 字符串。创建新的定时任务时使用生成器,审查或调试已有任务时使用解析器。

为什么使用这个 Cron 生成器?

手动编写 cron 表达式需要记忆字段顺序、取值范围和运算符规则。一个字段写错位置,就能把每天运行一次的任务变成每分钟运行一次。本生成器让您通过可视化界面选择计划,一键复制结果。

🖱️
可视化计划构建器
通过下拉菜单和开关选择分钟、小时、日期、月份和星期值,cron 表达式随每次字段修改实时更新,无需记忆语法。
🔒
隐私优先处理
所有生成均在浏览器本地运行,计划数据不会发送到服务器。您的 cron 表达式和任务配置始终保留在您的设备上。
即时输出与预览
构建过程中即可看到生成的 cron 表达式以及接下来的计划运行时间预览。复制到配置文件前先验证计划是否正确。
📋
无需账号
打开页面即可开始构建,无需登录、无需 API 密钥、无需安装。在任何支持现代浏览器的设备上均可使用,包括移动端。

Cron 生成器使用场景

前端开发者
为管理后台和调度 UI 构建 cron 表达式,为将 cron 字符串存入数据库的用户端计划选择器生成正确的语法。
后端工程师
为 Celery、Sidekiq、Bull 等任务队列创建 cron 表达式。生成计划字符串、验证下次运行时间,再粘贴到任务配置中。
DevOps / SRE
为 Kubernetes CronJob、CI/CD 管道和基础设施自动化生成 cron 计划。无语法错误地构建备份窗口、证书续期和日志轮转的表达式。
QA 工程师
创建在特定时间间隔触发的测试 cron 表达式,用于集成测试。生成具有可预测运行时间的计划,以验证调度器行为。
数据工程师
为 ETL 管道触发器和数据同步计划构建 cron 表达式。为提取、转换和加载阶段生成不重叠的计划,并精确控制时间间隔。
学习者
通过可视化构建器实验来学习 cron 语法。修改单个字段,观察表达式和下次运行时间的变化,从而直观理解通配符、范围和步长值。

常用 Cron 计划预设

下表列出了最常用计划的 cron 表达式。大多数生产任务都属于其中某种模式。根据实际时间需求修改各字段即可。

计划表达式典型用途
Every minute* * * * *Health checks, queue polling
Every 5 minutes*/5 * * * *Metrics collection, cache refresh
Every 15 minutes*/15 * * * *API sync, dashboard updates
Every hour0 * * * *Log rotation, report generation
Every 6 hours0 */6 * * *Database backups, digest emails
Daily at midnight0 0 * * *Nightly batch jobs, cleanup scripts
Daily at 9 AM0 9 * * *Daily reports, notification digests
Weekdays at 9 AM0 9 * * 1-5Business-hours tasks, standup reminders
Every Monday at midnight0 0 * * 1Weekly reports, dependency updates
First of every month0 0 1 * *Billing runs, monthly aggregation
Every Sunday at 2:30 AM30 2 * * 0Full backups during low-traffic window
January 1st at midnight0 0 1 1 *Annual reports, license renewals

Cron 表达式构建要素

每个 cron 表达式恰好有五个字段,从左到右依次读取。每个字段接受特定的取值和运算符。掌握这些规则,足以编写生产中遇到的任何计划。

五字段 cron 表达式结构:
*min0-59
*hour0-23
*day1-31
*month1-12
*weekday0-6

四个运算符控制每个字段中值的匹配方式。可以组合使用:星期几字段中的 1-5/2 表示周一、周三、周五(范围 1-5,步长为 2)。

运算符语法示例结果
Wildcard** (minute)Every minute
Lista,b,c1,15 (day)1st and 15th
Rangea-b9-17 (hour)9 AM through 5 PM
Step*/n*/10 (minute)Every 10 minutes
Range+Stepa-b/n10-30/5 (min)10, 15, 20, 25, 30

代码示例

如何在 Node.js、Python、Go 和 bash 中创建并注册 cron 计划:

JavaScript (Node.js)
import { CronJob } from 'cron';

// Build a cron expression: every weekday at 9:00 AM
const expression = '0 9 * * 1-5';

const job = new CronJob(expression, () => {
  console.log('Running weekday morning task');
});
job.start();

// Programmatic expression building
function buildCron({ minute = '*', hour = '*', dom = '*', month = '*', dow = '*' }) {
  return `${minute} ${hour} ${dom} ${month} ${dow}`;
}

const expr = buildCron({ minute: '0', hour: '*/6', dow: '1-5' });
console.log(expr); // → "0 */6 * * 1-5"
Python
from crontab import CronTab

# Create a new cron job for the current user
cron = CronTab(user=True)

# Build a job: run backup.py every day at 2:30 AM
job = cron.new(command='python3 /home/user/backup.py')
job.setall('30 2 * * *')

print(job)           # → 30 2 * * * python3 /home/user/backup.py
print(job.is_valid()) # → True

# Schedule every 15 minutes on weekdays
job2 = cron.new(command='/usr/bin/sync-data')
job2.minute.every(15)
job2.dow.during('MON', 'FRI')

cron.write()  # Save to user's crontab

# Verify next run time
from croniter import croniter
from datetime import datetime

it = croniter('30 2 * * *', datetime.now())
print(it.get_next(datetime))  # → next 2:30 AM timestamp
Go
package main

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

// BuildCron constructs a 5-field cron expression from parts
func BuildCron(minute, hour, dom, month, dow string) string {
    fields := []string{minute, hour, dom, month, dow}
    return strings.Join(fields, " ")
}

func main() {
    // Generate: every weekday at 9 AM
    expr := BuildCron("0", "9", "*", "*", "1-5")
    fmt.Println(expr) // → 0 9 * * 1-5

    // Validate and schedule it
    c := cron.New()
    _, err := c.AddFunc(expr, func() {
        fmt.Println("Running scheduled task")
    })
    if err != nil {
        fmt.Printf("Invalid expression: %v\n", err)
        return
    }
    c.Start()
}
Bash (crontab)
# Open the crontab editor to add a new job
crontab -e

# Add a cron job without opening an editor:
# Run cleanup.sh every Sunday at 3 AM
(crontab -l 2>/dev/null; echo "0 3 * * 0 /home/user/cleanup.sh") | crontab -

# Generate and add a job: every 10 minutes, log disk usage
EXPR="*/10 * * * *"
CMD="df -h >> /var/log/disk-usage.log"
(crontab -l 2>/dev/null; echo "$EXPR $CMD") | crontab -

# Verify the job was added
crontab -l | tail -1
# → */10 * * * * df -h >> /var/log/disk-usage.log

# Remove all cron jobs (use with caution)
# crontab -r

常见问题

cron 表达式的字段顺序是什么?
标准五字段顺序为:分钟(0-59)、小时(0-23)、月份中的日期(1-31)、月份(1-12)、星期几(0-6,0 为周日)。该顺序由 POSIX 定义,crontab、Kubernetes、GitHub Actions 及大多数 cron 库均遵循此规范。Quartz Scheduler 等工具会在前面添加秒字段,变为六字段格式,但五字段布局是通用默认格式。
如何生成“每 N 分钟”执行的 cron 表达式?
在分钟字段中使用步长运算符:*/N。每 5 分钟写 */5 * * * *,每 15 分钟写 */15 * * * *。步长运算符将字段范围均匀划分。注意 */7 并不会跨越整点每 7 分钟执行一次,而是在 0、7、14、21、28、35、42、49、56 分钟执行,然后在下一个整点重置为 0。
能否生成在每月最后一天执行的 cron 表达式?
标准 POSIX cron 没有“每月最后一天”运算符,无法在 crontab 或 Kubernetes CronJob 中写 0 0 L * *。变通方案包括:计划在 28-31 日执行并添加 Shell 检查([ $(date +%d -d tomorrow) -eq 01 ]),或使用支持 L 修饰符的扩展 cron 实现(如 Quartz)。AWS EventBridge 速率表达式也可原生指定每月最后一天。
cron 生成器和 cron 解析器有什么区别?
cron 生成器接受您的调度需求(例如“每个工作日上午 9 点”),输出正确的 cron 表达式(0 9 * * 1-5)。cron 解析器则反向操作:接受已有表达式,输出人类可读的描述。创建新计划时使用生成器,审查或调试已有计划时使用解析器。
如何避免 cron 任务重叠执行?
cron 本身不阻止任务重叠执行。如果一个每分钟触发的任务耗时 90 秒,就会产生两个实例同时运行。解决方案包括:使用锁文件(bash 中的 flock)、分布式锁(Redis、etcd),或调度器内置的并发策略。Kubernetes CronJob 提供 concurrencyPolicy 字段,可设为 Forbid 或 Replace。在 Celery 等应用层调度器中,可使用 solo 池或任务级锁。
cron 中星期几字段的第一天是 0 还是 1?
在 POSIX cron 中,0 为周日,6 为周六。大多数实现中 0 和 7 都表示周日。Quartz Scheduler 使用不同的约定:1 为周日,7 为周六。如果您的系统支持命名星期(SUN、MON、TUE),建议使用命名方式以避免跨平台混淆。
如何为特定时区生成 cron 表达式?
传统 crontab 使用系统本地时区,部分系统支持在 crontab 文件中设置 TZ 变量(TZ=America/New_York)。Kubernetes CronJob 自 1.25 版本起支持 .spec.timeZone 字段。AWS EventBridge 和 Google Cloud Scheduler 允许按计划指定时区。务必在配置中将预期时区与 cron 表达式一并注明。