用途与使用方法
适合准备五字段 Cron 字符串,随后在目标调度器核对语法与触发时间。当前表单只有 Cron 五字段入口,默认结果没有 RRULE。
- 按顺序填写分钟、UTC 小时、日、月和星期;先确认目标调度器使用的星期编号。
- 点击“生成”,读取 cron 行与 Cloudflare Worker 配置片段。
- 在目标环境校验接下来几次触发时间,再按其配置流程启用;生成文本不会替你部署或创建任务。
默认输入与实际输出
以下为 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 日历时刻 | 核对点 |
| 1 | 2026-10-15 周四 02:00 | 2026-10-15 周四 10:00 | Cloudflare 星期 5,同日 |
| 2 | 2026-10-19 周一 02:00 | 2026-10-19 周一 10:00 | Cloudflare 星期 2,同日 |
| 3 | 2026-10-22 周四 02:00 | 2026-10-22 周四 10:00 | Cloudflare 星期 5,同日 |
10 月 12 日周一已经早于起点,不应列入这次“向后”核对。这里只列匹配表达式的日历时刻;真实任务是否触发、是否成功完成,要另查部署配置和执行证据。
例二:北京时间周一凌晨,对应 UTC 周日
需求若是“北京时间每周一 01:00”,先将完整本地日期时间减去八小时,得到前一天 UTC 17:00。因而按 Cloudflare 规则使用 0 17 * * SUN(数字写法为 0 17 * * 1),而不是 MON。以下同样从上述固定起点往后取三个匹配时刻。
| UTC 日历时刻 | Asia/Shanghai 日历时刻 | 日期变化 |
| 2026-10-18 周日 17:00 | 2026-10-19 周一 01:00 | 跨一天,周日变周一 |
| 2026-10-25 周日 17:00 | 2026-10-26 周一 01:00 | 跨一天,周日变周一 |
| 2026-11-01 周日 17:00 | 2026-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”的配置。
在目标环境启用前,怎样留一份可核对的记录?
- 写清业务要求使用的时区、当地星期和时刻,固定检查起点,并注明是否包含起点本身。
- 把完整日期时间换成 UTC,再按目标平台的星期约定写表达式;跨日时同时检查星期与月日。
- 像上表一样列出至少三个预期日历时刻,另选一次跨日或跨月样例;在目标平台核对表达式语法。表格只检验本例的简单规则,不能证明复杂日/月条件正确。
- Cloudflare 的配置需将 crons 放在 triggers 下,并提供 scheduled 处理入口;页面输出片段不等于完成这些步骤。官方文档说明配置变更传播可能需要最多约 15 分钟,不能把刚保存后未见执行直接判为表达式错误。
- 启用后分别保留“配置已生效”“定时事件到达”“业务操作完成”的证据。一次手工调用处理函数不能证明定时器按计划触发,事件到达也不能证明业务操作成功。
本节新验证范围仅为官方规则核对及上述固定日期的离线换算。未部署 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。
两个反例,防止把固定间隔当成字段匹配
- 01:00 必须匹配 */7。这一小时的分钟字段为 0,而 0 在 0、7、…、56 的集合中。把 00:56 再加七分钟会漏掉它。
- 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 或非法值校验测试。日期、月份和星期均为星号,不能据此证明工具的星期字段兼容性或复杂日期规则正确。