有青岛的同行问我,时区为什么老出问题?我的答案是:存的时候用错、算的时候混着来,就容易乱。统一按标准时间存、只在展示时转成用户所在时区,问题就少一大半。信服无限青岛团队踩过这类坑。
存的时候统一
数据库里统一存标准时间,别把本地时间混着写进去。口径一致,后面才好算。青岛不少项目把用户本地时间直接存进库,一跨时区,同一条数据谁看都不一样,对起来一团乱麻。
统一口径是根本。青岛做开发的都清楚,不管用户在哪个时区,存进数据库的都换算成同一个标准时间。这样数据本身是干净的,展示时再按需转换,逻辑清楚,也不容易错。
只在展示时转换
时区转换放在展示那一步,别在计算中间转来转去。转换越多越容易错。青岛不少代码在好几个环节各转一次,转着转着自己都乱了,到头来算出来的时间差了几个小时,还找不出在哪错的。
转换点要集中。青岛做开发的,习惯把时区转换收在一处统一处理,别的逻辑都对着标准时间算。转换点少了,可读性也高,出问题好定位,不至于满代码找哪儿算错了。
边界情况要想全
夏令时、跨天、跨年这些边界,最容易出错。提前想到,别等出事。青岛不少项目平时没事,一到某些地区调整时间就出岔子,订单时间错乱,排查起来还特别费劲。
边界要专门测。信服无限青岛团队做这类功能时,会把跨天、跨年、夏令时切换这些场景单独造数据测一遍。平时多花这点功夫,上线后就少一堆莫名其妙的线上问题,省心得多。
时区处理的常见疑问
时间都用标准时间存吗
建议是,统一存标准时间,展示时再按用户时区转换,最不容易出错。
夏令时要处理吗
有跨时区业务就要考虑,测试时把切换场景单独覆盖一遍。
统一口径,才不容易错
统一存、只在一处转、把边界想全,时区才不容易出问题。信服无限团队做开发时,最在意时间有没有算错。把该做的做在前面,后面就少操不少心,这道理放在哪都通用。事情一件件理顺,看着慢,走着走着你就会发现比想象中顺。你要在青岛,先检查一下项目里时区转换是不是散在好几处。