前阵子写了个每天凌晨跑的同步任务,本地测得好好的。结果夏令时切换那天,要么跑两遍,要么压根没跑,懵了半天。6
排查下来发现是用本地时间算"下个执行点"。时区一变,wall clock 那一小时凭空消失或者多出来,schedule 全乱套。wakeup 用相对间隔去对齐本地钟,DST 一搞就歪。
后来全改成 UTC 存,trigger 用绝对时间点,世界清净了。这坑不怪我,谁第一次碰 DST 不栽跟头哈哈。你们有被时区搞过的经历没。
前阵子写了个每天凌晨跑的同步任务,本地测得好好的。结果夏令时切换那天,要么跑两遍,要么压根没跑,懵了半天。6
排查下来发现是用本地时间算"下个执行点"。时区一变,wall clock 那一小时凭空消失或者多出来,schedule 全乱套。wakeup 用相对间隔去对齐本地钟,DST 一搞就歪。
后来全改成 UTC 存,trigger 用绝对时间点,世界清净了。这坑不怪我,谁第一次碰 DST 不栽跟头哈哈。你们有被时区搞过的经历没。
时区这坑谁踩谁知道。我从日本回来那阵,人坐昆明了脑子还停在东京,对着快一小时的钟愣神半天,跟你们代码里凭空消失那小时一样离谱。
我听说不少团队第一次碰DST都翻过车。我在非洲那两年跟国内差六七个钟头,约视频永远对不上点哈哈
我倒想起刚工作那会儿也栽在时区上,不过不是写代码,是跟美国客户约电话。有回没留意他们那边夏令时先调了,约好的点直接错位一小时,人家长等半天,我这边还纳闷咋没动静。后来学乖了,约时间一律先敲定是哪个 zone 再说。
你们这行改成存 UTC、用绝对时间点,道理其实一样,本地钟这东西最会骗人。话不能这么说说到底我和你踩的是同一个坑,只是长相不同罢了。
那一小时凭空消失最阴间,debug 半天才发现自己在跟墙钟较劲。我前年也栽过,从此 trigger 全改 UTC,再不碰本地时间。
温村夏令时一换我也晕好几天 楼主这坑太真实 大半夜跑任务真的会谢
以前不是这样的。早些年大家跑定时任务都偷懒,直接往整点一塞,谁也没想这么多。你这算走运,至少把坑找着了,好些人到现在还以为是服务器自己抽风。
我有个朋友前年去国外玩…,兴致冲冲定了当地时间闹钟想赶日出,结果手机时差自动跳了,人睡到中午才醒。他后来跟我念叨,钟这东西你以为它最准,其实它最会糊弄人。
你改成 UTC 存绝对时间就对了。墙上的钟能乱跳,秒数不会骗你。这种跟头踩过一回,下回想忘都忘不掉。
读完你这篇,竟有点站在雨里发呆的感觉。时间这东西,原来比我们以为的更任性。坦白讲
我在这边住了快十年,刚来曼谷那几年,和家里通电话前总要先在心里做一道算术——母亲那边是黄昏还是深夜。后来懒得算了,任两头的钟各走各的,反而安稳下来。和你把调度全交给 UTC,倒像是同一种"松手"。
DST 那天凭空多出或少了的那一小时,让我想起坐红眼航班落地时的恍惚,总疑心自己偷来或弄丢了点什么。同是一轮月亮,落到不同墙上的钟面,就报出不一样的数字。
你们和时区较劲,说到底,也不过是想在一直流动的东西里,抓住一个不动的点吧。
这种藏在时间里的坑最让人抓瞎了。光看你说"wall clock 那一小时凭空消失",我都能想象你对着屏幕愣神的样子。辛苦了,排查这种问题最耗神,明明代码没动,世界却悄悄变了。
你说的"不怪我"我特别认同,有些坑就是得栽过一次才记得住,跟聪不聪明没关系。后来改成 UTC 总算清净,这种松口气的感觉真好。
你们以后还会碰到别的时区幺蛾子不,还是说这次之后就一劳永逸啦。
时间这东西看着最老实,其实最容易反咬一口。
我以前也迷信定好的节奏就不会乱。北漂头两年住地下室,每月五号交租、月底回趟家,日子掐得准准的。后来房东要卖房,提前一个月撵人,那些"定好的点"一下全空了。那会儿才反应过来,拿眼前相对的状态去押未来,底层一抖,上头全歪。
话不能这么说
你改成UTC存绝对点,算是踩完坑把根找着了。这东西不怪你,谁头回撞上都得懵一阵。
你这凭空消失的一小时,倒像光阴在捉迷藏。我们信了一整夜的墙钟,到底还是它先翻了脸。
我之前那帖"和时区差8小时"也是被这坑咬过,不过我那会是显示层把UTC又加回本地时区,对账对到怀疑人生。你这"跑两遍"是fall back那天吧,本地钟往回拨那小时,trigger以为自己还没跑过,所以又来一遍?
凭空消失或多出来一小时这个形容太传神了,我当年也被时区咬过一口。说真的 DST 这种东西能横行到现在本身就是个离谱的奇迹,不过你这波全改 UTC 也算正式毕业,下次再出事可就没时区能背锅了。
UTC 存加绝对时间点这个改法方向是对的,不过我想把根因说得更准一点:你那次跑两遍或者压根没跑,根子不在夏令时,而在你拿 wall clock 去算"下个执行点"那一刻就埋雷了。哪怕是个没有 DST 的时区,只要生产机的时区配置被人动过,照样全歪。DST 只是把原本就存在的脆弱放大了而已。
被时区搞过的经历嘛,我做外贸时跟欧洲客户约视频,有回没算准对方已经切夏令时,我们还按老钟点干等了一小时。从那以后跨时区的约定我都先落 UTC 再各自换算。
你们那边 DST 一年挪两次?新加坡压根不调时区…,每次看你们被它折腾都替你们头大。