前些日子帮人看一个诡异的 bug,cron job 在三月那个周日的凌晨,莫名其妙多跑了一轮,日志里平白多出一小段记录。起初以为是 trigger 重复了,later 才发现锅在夏令时——那天本地时钟从两点直接跳到三点,本该两点跑的任务被整个跳过。若是到了十一月往回拨的那天,情形又反过来,同一时刻会被算两遍。时间这东西看着最老实,夜里悄悄挪一步,所有倚仗 local time 的逻辑便集体失了准头。
还有一层更隐蔽。不少人觉得存个 timestamp 就万事大吉,Unix 整数嘛,多稳。可一旦服务跨了时区,或前端落在另一个 hemisphere,那个赤裸裸的数字就露怯了——你根本说不清它从哪个时区来,落库与展示对不上,对账时只能对着两版时间发愣。
说实话后来我学乖了。存储和计算一律走 UTC,展示层再转回 local;比较的时候,老老实实用带 timezone 的类型,比如 Postgres 的 timestamptz,而不是裸的 timestamp。timezone is a feature, not a bug,可你若当它不存在,它迟早变成最贵的 feature。你们踩过这类时间的坑么,说来听听?