cron 的时区变量 CRON_TZ
业务跨时区时,可以在任务表里用 CRON_TZ 指定该表的时区,让任务按目标时区而不是系统时区执行。cronie 及多数现代实现支持这个变量,个别老版本会把它当成普通变量忽略。系统级时区统一交给 timedatectl 管理更稳,跨时区业务则建议在任务表里显式声明。
基本信息
| 用途 | 避免跨时区场景下执行时间错位 |
|---|---|
| 写法 | CRON_TZ=Asia/Shanghai 写在任务行之前 |
| 系统级做法 | timedatectl set-timezone 设置整机时区 |
| 兼容性 | 个别老版本 cron 会忽略该变量 |
典型使用场景
- 业务面向海外用户,需要按当地时间触发任务
- 报表按客户所在时区生成
- 多机房系统时区不统一但任务时刻要求一致
- 促销或活动按特定时区的整点触发
- 排查任务提前或推迟执行的时区因素
- 评估夏令时地区的时间处理边界
示例与校验
示例与校验
# 按上海时间每天 08:00 执行,不受系统时区影响
CRON_TZ=Asia/Shanghai
0 8 * * * /opt/app/greet.sh
timedatectl | grep -i 'time zone' # 查看系统时区
timedatectl list-timezones | grep -i shanghai # 校验时区名是否有效
date # 确认当前系统时间与时区
journalctl -u crond --since today | tail -20 # 看任务实际触发时刻时区相关项
| 项 | 作用 | 注意点 |
|---|---|---|
| CRON_TZ | 指定该任务表的时区 | 写在任务行之前,作用于其后的行 |
| 系统时区 | 整机默认时间参考 | 用 timedatectl 统一管理 |
| 时区名 | 如 Asia/Shanghai | 必须是系统识别的标准名称 |
| 夏令时 | 切换时可能出现跳过或重复小时 | 金融类任务需评估影响 |
| 日志时间 | 按系统时区记录 | 对账时必须换算 |
个别老版本 cron 不识别 CRON_TZ,会把它当普通环境变量忽略:关键任务上线前要做一次跨时区验证,不能只看配置写了什么。
系统时区与业务时区混用,最容易导致任务提前或推迟若干小时;评审时用 date 输出与日志时间双向核对。
夏令时切换地区会出现某个小时被跳过或重复,依赖整点触发的任务要考虑这种边界,必要时避开切换日的特定时刻。