背景
- 招聘面试的时候我喜欢这样问:
- 基础:知道UTC是什么吗?与GMT什么区别?
- 进阶:不用UTC会产生什么问题?
- 高阶:有夏令时制的地区,如LosAngles每年3月/11月都有一切时区切换UTC-7/UTC-8 ,为避免对数据落库时间的影响,我们如何处理?
- 有的人说我只用北京时间,说明你只做国内产品,没有设计过国际系统(跨时区,跨地区)的经验。或者视野不够宽泛。
- 也有的前端说我只做前端,为什么要关注这些。我想说,难道你的职业规划就是个前端么?你应该不断了解你的技术、你的系统、甚至你的产品、你的公司以及业务目标,如何这些你能够非常了解,恭喜你,你是聪明且高潜的开发者,联系我,推荐你到BAT大厂工作。大厂需要的是走路看路的人才,否则,你和另一个前端的区别是什么?
什么是UTC?
- 时区:全球共分为24个时区。中国幅员宽广,差不多跨5个时区,但为了使用方便简单,实际上在只用东八时区的标准时即北京时间为准。(详见百科:baike.baidu.com/item/%E6%97…)
- UTC: 协调世界时,又称世界统一时间、世界标准时间、国际协调时间。它从英文“Coordinated Universal Time”/法文“Temps Universel Cordonné”妥协一下,简称UTC
- GMT,即格林尼治平太阳时间,是指格林尼治所在地的标准时间, 也是表示地球自转速率的一种形式,它是基于国际原子时间。UTC是现世界标准时。
- UTC比GMT更标准。每年格林尼治天文台会发调时信息,基于UTC。不精确到秒的差异,民间可以理解UTC约等于GMT
- 这里再延伸常用的:Unix时间戳(Unix timestamp),是基于UTC 1970年01月01日00时00分00秒起至现在的总秒数。32位操作系统会有时间溢出,就在:2038年01月19日03时14分07秒(二进制:01111111 11111111 11111111 11111111),64位操作系统则不会遇到这类溢出情况,自己算算是多少年。
不用UTC会产生什么问题?
- 这个问题应该描述为,时间串如:2020-03-30 12:00:09.332 ,如果保存到数据库的时候,会产生什么问题?
- 答案是:上下游系统消费你这个数据的时候,根本无法知道你是相对于哪个时区产出的时间,当然就没有办法更友好地处理成相应友好的显示时间了。比如:
- 想想服务器部署在美国,有个中国用户用浏览器访问这个页面。这里就存在localtime与服务器时间的区别。如果前端用localtime,保存到服务器后,在美国的后台看看根据当地时间是否筛选出来正常的数据?
- 另外一个场景是服务端调度服务功能,如订单处理服务,如果服务器时间与用户所在区时,肯定会让用户迷惑,怎么没到点就变成已完成了?
夏令时制切地区的问题
- 数据保存的时候用UTC ,展现给用户的时候当然要本地化!本地化时根据时区切换,用脚本进行同步修改,避免对落库时间的影响。
原则
所以正确处理时间准备性的做法,是必须带有时区信息的(比如Unix Epoch就隐含了使用UTC时区)这跟所有金额要求必须带上货币单位是同一个道理。系统设计时,数据保存的时候建议用UTC ,(但国内似乎很少有遵守的,等着踩坑)展现给用户的时候当然要本地化!
喜欢看技术管理类文章,请关注公众号“群鱼湾”,与你一起成长。