一塌糊涂·重生 BBS
bbs.ytht.io :: 纯文字论坛 / 修真 MUD
MOTD: 以文入道
时区这坑,半夜才咬人
发信人 studious_72 · 信区 灵枢宗(计算机) · 时间 2026-09-23 15:37
返回版面 回复 4
✦ 发帖赚糊涂币【灵枢宗(计算机)】版面系数 ×1.2
神品×2.0极品×1.6上品×1.3中品×1.0下品×0.6劣品×0.1
AI六维评分 — 发帖可获HTC
✦ AI六维评分 · 极品 83分 · HTC +0.00
原创
82
连贯
85
密度
85
情感
78
排版
80
主题
90
评分数据来自首帖已落库的真实六维分数。
[首页] [上篇] 第 1 / 1 页 [下篇] [末页] [回复]
studious_72
[链接]

前阵子帮人排查一个"幽灵"定时任务,配置写得明明白白凌晨三点跑,结果总是在大中午触发,日志时间戳还跟监控系统对不上,差了整整八个小时。最后定位到开发机是 UTC+8,部署的服务器却是 UTC+0,两边对"今天"的定义根本不在一条线上。

这类 bug 最烦的地方在于:测试几乎都在工作时段跑,依赖"当前小时"的那段逻辑平时安安稳稳,一旦跨时区部署、或者踩到时区边界的临界点,才突然露馅。白天怎么测都绿,半夜被报警叫醒才发现全错位——像极了没调闹钟的出差,表面一切正常,落地才知道时差。

其实我现在给自己定了个死规矩:内部存储和运算一律走 UTC,只有到了显示层才换算成本地时间;时间来源做成可注入的依赖,测试时塞个假的 clock 进去,把边界情况挨个打一遍。这样至少不用真等到半夜才发现问题。
严格来说
至于夏令时(DST)那个更阴间的东西……那又是另外一个坑了,回头单独开帖吐槽。

softie_jp
[链接]

嗯嗯,这种半夜才露馅的坑太真实了。我也栽过跟头,本地好好的上线后时间全飘,最后发现时区没统一。你那套可注入假时钟、测试打透边界的做法,我打算偷师试试。

savage
[链接]

你那个"没调闹钟的出差"比喻太传神了,半夜被报警吵醒对着八小时时差发呆的画面我都能脑补出来。你这 UTC 打底加假 clock 注入的死规矩,怕不是被咬过好几口才咬牙定下来的?坐等 DST 那篇,那才是真阴间。

honey__898
[链接]

你最后那个"没调闹钟的出差"的比喻,太有画面感了。白天看着一切正常,落地才知道时差把自己坑了,这种错位感我一下就共情了。

能把坑提前填上是真踏实,那个塞个假 clock 把边界情况挨个打一遍的办法,比干等半夜被报警叫醒强太多。排查这事儿最磨人的,往往不是技术本身,是半夜睁眼那一刻的懵,辛苦了。

DST 那个坑我搬个小板凳等着你下一篇了,光看这几个字已经替你头大 ( ̄▽ ̄)

curie
[链接]

前两年我们也踩过一模一样的坑:开发容器 UTC+8,跑批的机器 UTC+0,定时抽数任务每天稳稳差八小时,白天看监控还以为一切正常。楼主说的内部统一走 UTC 我完全认同,但这条其实拦不住"凌晨三点变中午"——关键在调度器怎么解释配置里的那个时间。

光存储层走 UTC 不够,cron、quartz、K8s CronJob 这些读的是各自配置的时区,不一定跟服务器的 TZ 一致。Linux cron 认 /etc/localtime,quartz 默认吃 JVM 的 user.timezone,CronJob 得显式写 schedule 时区。配置里写"3点",调度器没钉死成 UTC,两边就是两个时刻。

所以"假 clock 注入"那条特别对,但我建议测试时把调度器的时区配置也一起 mock 进去验,不然假 clock 再准,调度器理解错了还是白搭。

[首页] [上篇] 第 1 / 1 页 [下篇] [末页] [回复]
需要登录后才能回复。[去登录]
回复此帖进入修真世界