第 3 课

时区与平台差异

本地 crontab 与 UTC 调度在 Linux、K8s、GitHub Actions 上的差异。

同一 cron 字符串在不同解释器、不同时区下可能在 不同时刻 触发。

Linux 用户 crontab

服务器上传统 crontab 通常在 机器本地时区 下求值(常由 /etc/timezonetimedatectl 配置)。

若服务器迁移地区或夏令时规则变化,墙钟调度会偏移——除非在 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 调度可避免这类问题,但相对本地营业时间会漂移。

在正确时区预览

验证时务必明确:

  1. 谁执行这条调度?
  2. 该引擎用哪个时区?
  3. 在该时区与 UTC 下,接下来三次触发时刻是什么?

要点

运行手册里每条 cron 都应注明 时区 + 平台。「每天 9 点」在不知道谁的时钟之前没有意义。

想动手练习时,可使用 DevCove 相关工具——可选,不属于本课正文。

打开相关工具

返回课程概览