技术科普
时区与定时任务:夏令时下的坑
定时任务看似简单,一旦涉及时区和夏令时,就容易出现重复执行、漏执行或执行时间偏移。
常见问题
- 春季拨快一小时,本地时间2:30不存在,任务被跳过
- 秋季拨慢一小时,本地时间1:30出现两次,任务可能执行两次
- 服务器时区变更,cron 表达式含义随之改变
- 容器使用 UTC,与业务预期时区不一致
cron 的时区
传统 cron 按系统时区解释时间。可通过 CRON_TZ 或 TZ 环境变量指定时区,但不同实现支持程度不同。建议在脚本中显式处理时区。
systemd timers
systemd 定时器可设置 OnCalendar 和 Timezone=,并支持 Persistent=true 补执行错过的任务。仍需注意 DST 边界。
分布式调度
Kubernetes CronJob 支持 timeZone 字段。业务调度系统应明确时区,并对 DST 切换做测试。对“每天一次”的任务,使用 UTC 可避免本地时间歧义。
最佳实践
- 明确任务时区并在配置中写明
- 避免在 DST 切换的凌晨安排关键任务
- 使用幂等设计,防止重复执行造成副作用
- 记录任务实际执行时间,便于排查
定时任务的可靠性,取决于对时间边界的细致处理。