第 3 课
时区与平台差异
本地 crontab 与 UTC 调度在 Linux、K8s、GitHub Actions 上的差异。
同一 cron 字符串在不同解释器、不同时区下可能在 不同时刻 触发。
Linux 用户 crontab
服务器上传统 crontab 通常在 机器本地时区 下求值(常由 /etc/timezone 或 timedatectl 配置)。
若服务器迁移地区或夏令时规则变化,墙钟调度会偏移——除非在 OS 层统一用 UTC。
Kubernetes CronJob
CronJob 使用标准五字段。Kubernetes 1.25+ 起可用 timeZone 字段 指定 IANA 时区(如 Asia/Shanghai),而不继承控制平面本地时间。
未显式指定时,行为取决于 kube-controller-manager 配置——不要假设 与笔记本本地时间一致。
GitHub Actions
on.schedule 的 cron 始终按 UTC 解释,工作流级无时区开关。
Actions 里的 0 9 * * 1-5 表示 UTC 工作日上午 9 点——不是上海或旧金山上午 9 点。与本地 on-call 对齐时要主动换算。
Quartz、AWS EventBridge 与扩展语法
部分系统用六字段(秒在前)或 ? 表示「无具体值」。不经转换就把 Linux 行拷进 Quartz 是高频 bug。
跨厂商复用表达式前,先读 平台语法表。
夏令时边界
本地时区下「每天 02:30」在夏令时切换日可能 跳过或重复 一小时。UTC 调度可避免这类问题,但相对本地营业时间会漂移。
在正确时区预览
验证时务必明确:
- 谁执行这条调度?
- 该引擎用哪个时区?
- 在该时区与 UTC 下,接下来三次触发时刻是什么?
要点
运行手册里每条 cron 都应注明 时区 + 平台。「每天 9 点」在不知道谁的时钟之前没有意义。