技术科普

时区与定时任务:夏令时下的坑

定时任务看似简单,一旦涉及时区和夏令时,就容易出现重复执行、漏执行或执行时间偏移。

常见问题

  • 春季拨快一小时,本地时间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 切换的凌晨安排关键任务
  • 使用幂等设计,防止重复执行造成副作用
  • 记录任务实际执行时间,便于排查

定时任务的可靠性,取决于对时间边界的细致处理。