UTC Cron 表达式生成器

按分钟、UTC 小时、日、月、星期拼接五字段 Cron;输出配置片段,不创建定时任务或生成 RRULE。

点击生成

用途与使用方法

适合准备五字段 Cron 字符串,随后在目标调度器核对语法与触发时间。当前表单只有 Cron 五字段入口,默认结果没有 RRULE。

  1. 按顺序填写分钟、UTC 小时、日、月和星期;先确认目标调度器使用的星期编号。
  2. 点击“生成”,读取 cron 行与 Cloudflare Worker 配置片段。
  3. 在目标环境校验接下来几次触发时间,再按其配置流程启用;生成文本不会替你部署或创建任务。

默认输入与实际输出

以下为 2026-10-05 使用页面内置合成示例的浏览器核对记录;没有执行生成的命令、配置或技能。

c-min: 0
c-hour: 2
c-dom: *
c-mon: *
c-dow: 2,5
cron: 0 2 * * 2,5
# Cloudflare Worker example: "crons": ["0 2 * * 2,5"]
# UTC. Beijing +8: hour 2 → local 10:xx

适用边界

  • Cloudflare Workers Cron Triggers 使用 UTC,星期编号为 1=周日到 7=周六;默认 2,5 对应周一、周四。
  • 默认 0 2 * * 2,5 在 Cloudflare 是周一与周四 UTC 02:00,北京时间当天 10:00;其他 cron 实现的星期编号可能不同。
  • 可优先按目标平台文档使用 MON,THU 等星期缩写,减少数字歧义;该替代输入未在本次 UI 测试中运行。
  • 输出的 crons 只是配置片段。Cloudflare JSON 配置需放在 triggers 下,并具备 scheduled 处理入口。
  • 页面的北京时间提示不等于完整时区转换器。跨日、夏令时、复杂小时表达式和实际下一次运行时间均未验证;未验证非法值拦截。

常见问题

可以生成 RRULE 吗?

当前页面未提供 RRULE 输入或转换入口,已核对的输出只有五字段 Cron。

UTC 2 点就是北京时间 2 点吗?

不是。这个默认示例的 UTC 02:00 对应北京时间当天 10:00;跨日规则应另行核对。

为什么 2,5 不是周二和周五?

Cloudflare 的星期编号从周日=1 开始;不同调度器的数字约定可能不同,迁移时不要照抄数字。

继续阅读

请只使用脱敏示例,不要粘贴密钥或保密资料。站点的数据处理声明见隐私政策;本次核对没有进行独立网络行为审计。

日期化校验练习:把 UTC 与北京时间逐行对上

本节只按 Cloudflare Workers Cron Triggers 的规则讲解:五字段按分钟、小时、日、月、星期排列,时区为 UTC,星期数字 1=周日、2=周一、5=周四、7=周六。下列固定日期是人工推导参考,并用 Python 标准库 datetime 与 ZoneInfo 的 Asia/Shanghai 时区离线复算;不是本工具生成的预览,也不是线上调度器的运行记录。

规则依据为 2026-10-13 核对的 Cloudflare Cron Triggers 官方文档。本例使用 2026 年的 Asia/Shanghai(UTC+08:00),不能把固定加八小时照搬到有夏令时的其他地区,或用于解释任意历史日期。

例一:默认表达式,从固定起点向后列三次

把校验起点固定为 2026-10-13 00:00 UTC,即北京时间 2026-10-13 08:00。仅寻找严格晚于该时刻、符合 0 2 * * 2,5 的三个日历时刻:分钟为 0,UTC 小时为 2,星期为周一或周四。对应缩写写法为 0 2 * * MON,THU;这里只解释文档语法,没有对替代输入进行 UI 测试。

顺序UTC 日历时刻Asia/Shanghai 日历时刻核对点
12026-10-15 周四 02:002026-10-15 周四 10:00Cloudflare 星期 5,同日
22026-10-19 周一 02:002026-10-19 周一 10:00Cloudflare 星期 2,同日
32026-10-22 周四 02:002026-10-22 周四 10:00Cloudflare 星期 5,同日

10 月 12 日周一已经早于起点,不应列入这次“向后”核对。这里只列匹配表达式的日历时刻;真实任务是否触发、是否成功完成,要另查部署配置和执行证据。

例二:北京时间周一凌晨,对应 UTC 周日

需求若是“北京时间每周一 01:00”,先将完整本地日期时间减去八小时,得到前一天 UTC 17:00。因而按 Cloudflare 规则使用 0 17 * * SUN(数字写法为 0 17 * * 1),而不是 MON。以下同样从上述固定起点往后取三个匹配时刻。

UTC 日历时刻Asia/Shanghai 日历时刻日期变化
2026-10-18 周日 17:002026-10-19 周一 01:00跨一天,周日变周一
2026-10-25 周日 17:002026-10-26 周一 01:00跨一天,周日变周一
2026-11-01 周日 17:002026-11-02 周一 01:00跨一天,周日变周一
正确的逆向检查:
2026-10-19 周一 01:00 Asia/Shanghai
→ 2026-10-18 周日 17:00 UTC
→ UTC 星期 SUN,在 Cloudflare 是 1

只减小时、忘改星期的错误:
0 17 * * MON
→ 2026-10-19 周一 17:00 UTC
→ 2026-10-20 周二 01:00 Asia/Shanghai
比想要的周一凌晨晚了一天

例三:跨日可能同时跨月

每日 UTC 18:00 的表达式是 0 18 * * *。其中一个匹配时刻为 2026-10-31 周六 18:00 UTC,转换后是 2026-11-01 周日 02:00 Asia/Shanghai。此时小时、日、月和星期都需要在完整日期上核对;只把 18+8 取模成 2,会漏掉日期变化。本例仍是每日规则,不能推导为“每月 1 日北京时间 02:00”的配置。

在目标环境启用前,怎样留一份可核对的记录?

  1. 写清业务要求使用的时区、当地星期和时刻,固定检查起点,并注明是否包含起点本身。
  2. 把完整日期时间换成 UTC,再按目标平台的星期约定写表达式;跨日时同时检查星期与月日。
  3. 像上表一样列出至少三个预期日历时刻,另选一次跨日或跨月样例;在目标平台核对表达式语法。表格只检验本例的简单规则,不能证明复杂日/月条件正确。
  4. Cloudflare 的配置需将 crons 放在 triggers 下,并提供 scheduled 处理入口;页面输出片段不等于完成这些步骤。官方文档说明配置变更传播可能需要最多约 15 分钟,不能把刚保存后未见执行直接判为表达式错误。
  5. 启用后分别保留“配置已生效”“定时事件到达”“业务操作完成”的证据。一次手工调用处理函数不能证明定时器按计划触发,事件到达也不能证明业务操作成功。

本节新验证范围仅为官方规则核对及上述固定日期的离线换算。未部署 Worker、未创建定时任务、未触发 scheduled 事件、未测试表单校验;原有“本次 UI 仅核对默认示例”的边界仍然适用。

跨小时验收:*/7 为什么不是固定每隔七分钟?

先看分钟集合,再看跨整点的间隔。在本节采用的分钟步长规则下,*/7 * * * *表示每个小时的第 0、7、14、21、28、35、42、49、56 分钟。到了下一个小时,又从第 0 分钟匹配。因此 00:56 后是 01:00,只隔四分钟;它不表示从某个起点不断加七分钟。

依据:Cloudflare 官方文档规定五字段、分钟范围 0–59、步长符号 / 与 UTC 时区;其官方 saffron 仓库说明该解析器用于 Cron Triggers。固定版本源码将星号步长展开为字段最小值到最大值,再按步长选取匹配值。Cronie 官方手册也说明步长只在所属字段内计算。上述来源于 2026-10-13 核对;这里只比较分钟步长,不把不同 Cron 方言的全部语法视为相同。

完整输入:固定时区、观察窗口和间隔锚点

全部时刻使用 2026-10-13 UTC,秒数均为 00。观察窗口为 00:40:00 < 时刻 < 01:16:00,不含两端。固定七分钟序列另以当天 00:00:00为锚点,取“锚点 + k × 七分钟”(k 为非负整数);不能把观察窗口的 00:40 当作新锚点。

字段填写参考(本节未操作生成器):
分钟 c-min: */7
小时 c-hour: *
日 c-dom: *
月 c-mon: *
星期 c-dow: *

按字段拼接:*/7 * * * *
对照表达式:*/15 * * * *
固定间隔序列:2026-10-13 00:00 UTC + k × 7 分钟
最后一行是人工定义的时间序列,不是 Cron 表达式。

完整输出:同一个窗口,两种规则

下表列出两组序列在窗口内出现的所有时刻。它是按规则推导并离线复算的参考,不是本工具生成的运行预览,也不是调度日志。

2026-10-13 UTC,秒数均为 00
时刻*/7 字段匹配00:00 起每隔七分钟
00:42匹配在序列中
00:49匹配在序列中
00:56匹配在序列中
01:00匹配不在序列中
01:03不匹配在序列中
01:07匹配不在序列中
01:10不匹配在序列中
01:14匹配不在序列中
  • */7 的六个匹配时刻,相邻间隔依次为 7、7、4、7、7 分钟。
  • 固定七分钟序列有五个时刻,相邻间隔为 7、7、7、7 分钟。
  • 正向对照 */15 * * * * 在同一窗口内是 00:45、01:00、01:15,间隔为 15、15 分钟。15 能整除 60,这个常见案例会掩盖跨小时差异,不能据此类推 */7。

两个反例,防止把固定间隔当成字段匹配

  1. 01:00 必须匹配 */7。这一小时的分钟字段为 0,而 0 在 0、7、…、56 的集合中。把 00:56 再加七分钟会漏掉它。
  2. 01:03 不匹配 */7。分钟 3 不在集合中;但它距离固定锚点 00:00 为 63 分钟,确实属于七分钟间隔序列。

如果只检查 00:42、00:49、00:56,两个规则的结果完全相同,错误会被漏掉。至少检查一次跨整点。把分钟改写成显式列表 0,7,14,21,28,35,42,49,56 * * * *也不能修复固定间隔需求:该列表仍在每个小时重复。

可复算脚本:只做本例的 UTC 日期算术

把以下内容保存为 reproduce.py,用 Python 3 执行 python3 reproduce.py。仅使用标准库,不安装依赖,不访问网络,也不创建任务。代码直接实现本节已写明的两个分钟集合和固定锚点规则,没有解析输入表达式;它不是通用 Cron 解析器。

"""Fixed UTC arithmetic only; not a cron parser or a scheduler test."""
from datetime import datetime, timedelta, timezone

anchor = datetime(2026, 10, 13, tzinfo=timezone.utc)
start = anchor + timedelta(minutes=40)
end = anchor + timedelta(minutes=76)
window = [anchor + timedelta(minutes=m) for m in range(41, 76)]
field7 = [t for t in window if t.minute in range(0, 60, 7)]
fixed7 = [t for t in window if (t-anchor) % timedelta(minutes=7) == timedelta(0)]
field15 = [t for t in window if t.minute in range(0, 60, 15)]

def times(seq):
    return [t.strftime("%H:%M") for t in seq]

def gaps(seq):
    return [int((b-a).total_seconds() / 60) for a, b in zip(seq, seq[1:])]

assert times(field7) == ["00:42", "00:49", "00:56", "01:00", "01:07", "01:14"]
assert times(fixed7) == ["00:42", "00:49", "00:56", "01:03", "01:10"]
assert times(field15) == ["00:45", "01:00", "01:15"]
assert gaps(field7) == [7, 7, 4, 7, 7]
assert gaps(fixed7) == [7, 7, 7, 7]
assert gaps(field15) == [15, 15]
assert anchor + timedelta(minutes=60) in field7
assert anchor + timedelta(minutes=63) not in field7
assert anchor + timedelta(minutes=63) in fixed7
assert field7 != fixed7

print("UTC date: 2026-10-13; seconds: 00")
print("Window: 00:40 < t < 01:16; fixed interval anchor: 00:00")
for label, seq in [("*/7", field7), ("fixed7", fixed7), ("*/15", field15)]:
    print(label + ": " + ", ".join(times(seq)))
    print("gaps(min): " + ", ".join(map(str, gaps(seq))))
print("10 assertions passed")

本节离线执行得到的完整输出:

UTC date: 2026-10-13; seconds: 00
Window: 00:40 < t < 01:16; fixed interval anchor: 00:00
*/7: 00:42, 00:49, 00:56, 01:00, 01:07, 01:14
gaps(min): 7, 7, 4, 7, 7
fixed7: 00:42, 00:49, 00:56, 01:03, 01:10
gaps(min): 7, 7, 7, 7
*/15: 00:45, 01:00, 01:15
gaps(min): 15, 15
10 assertions passed

读完后怎样验收真实需求?

  • 如果需求是每小时这些分钟点,写出分钟集合,并在目标调度器核对跨整点的匹配时刻。
  • 如果需求是固定经过七分钟,先写清锚点;如果是每次任务完成后再等七分钟,还要明确从开始还是完成计时、停机后是否补跑、任务是否允许重叠,再选支持这些语义的调度方式。本例不提供或验证 Cloudflare 固定间隔配置。
  • 本次新增验证仅包括官方资料核对、标准库日期算术和 10 个预期断言。没有运行 Cronie 或 saffron、没有部署 Worker、没有测试定时事件,也没有新增生成器 UI 或非法值校验测试。日期、月份和星期均为星号,不能据此证明工具的星期字段兼容性或复杂日期规则正确。

填写五个字段

按分钟、小时、月内日期、月份和星期的顺序填写字段,点击生成即可得到 Cron 表达式。输出同时提供 crons 配置片段和小时换算。星号表示该字段不限制;每个调度平台支持的语法需要在其配置里核对。

每天运行的示例

分钟填写 0、小时填写 2,其余三个字段填写星号,得到 0 2 * * *。以 UTC 解释时表示每天 02:00,对应东八区每天 10:00。工具会拼接输入字段,不执行任务,也不验证完整的范围或调度平台语法;小时换算示例适用于填写单个数字小时。

常见问题

生成后定时任务会被创建吗?

不会。需要把表达式配置到实际调度平台,并确认时区、运行日志和任务结果。

继续阅读