Jenkins 不支持跨时区构建任务,其定时调度始终基于 JVM 启动时设定的时区(默认 UTC),需通过统一设置目标时区(如 Asia/Shanghai)并配合用户界面时区偏好实现本地时间感知;多地独立触发需拆分为多个任务并换算为 UTC cron 表达式。

Jenkins 本身不支持“跨时区构建任务”这一概念——它没有内置的多时区调度引擎。所谓“跨时区”,实际是指:让同一套定时构建规则,在不同时区用户视角下,按各自本地时间准确触发(比如北京用户设“每天9点”,东京用户也看到“每天9点”,但两者物理执行时刻不同)。这需要分层配置,核心是区分系统底层时间基准和用户/任务感知时间。
明确 Jenkins 的时间基准来源
Jenkins 的定时构建(cron)始终基于 JVM 启动时确定的时区运行,不是 UI 显示时区,也不是宿主机时区自动同步。默认使用 UTC,若未显式设置,所有定时任务都按 UTC 解析表达式。例如你写 H 9 * * *,Jenkins 实际在 UTC 时间每天 09:00 执行,对应北京时间就是 17:00 —— 这不是“跨时区”,而是“固定 UTC 基准下的错位执行”。
让定时任务按本地时间触发(推荐方案)
关键不是让 Jenkins “跨时区”,而是统一把它的调度基准设为你目标业务时区(如 Asia/Shanghai),再配合用户级时区设置,实现视觉与执行的一致:
- 启动 Jenkins 时注入 JVM 参数:
-Dorg.apache.commons.jelly.tags.fmt.timeZone=Asia/Shanghai -Duser.timezone=Asia/Shanghai(适用于 Linux systemd 或 Docker 启动) - Docker 环境下,直接加环境变量:
-e TZ=Asia/Shanghai,并确保镜像已安装 tzdata(官方镜像已含) - 避免仅靠脚本命令行临时设置:
System.setProperty(...)只影响 Web UI 和日志显示,不影响 cron 调度器实际触发时间
为不同用户适配各自时区显示
即使 Jenkins 统一用北京时间调度,每个用户仍可在个人设置中选择自己偏好的时区,用于界面时间显示:
- 右上角用户名 → 设置 → 拉到底部找到“用户定义的时区” → 选择对应城市(如 Asia/Tokyo、America/Los_Angeles)
- 该设置只改变构建历史、日志时间戳的显示格式,不改变任务实际执行时刻
- 适合跨国团队协作:所有人看到的“构建时间”是自己本地时间,但后台统一按上海时区准时运行
复杂场景:需真正按多地本地时间分别触发
如果业务要求“北京每天9点 + 东京每天9点 + 旧金山每天9点各触发一次构建”,这不是单个任务能解决的,应拆解为多个独立任务:
- 创建三个自由风格任务,名称注明时区(如 deploy-beijing-9am)
- 每个任务配置各自的 cron 表达式,并换算为 UTC 时间:
– 北京 9:00 → UTC 01:00 →0 1 * * *
– 东京 9:00(UTC+9)→ UTC 00:00 →0 0 * * *
– 旧金山 9:00(PDT, UTC-7)→ UTC 16:00 →0 16 * * * - 或使用插件如 Job DSL 或 Parameterized Scheduler 动态生成多时区任务模板


















