业务跨时区要解决的几个问题

261 阅读4分钟

背景

不同时区,对同一时刻的显示是不同的。

服务器与客户端可能不在一个时区。

服务器之间,也可能在不同时区。

不同客户端不在同个时区。

不同时区都会有同一个日期,对应的周几也是相同的,但是这个日期对应的时间戳是不同的。

具体解决思路

对同一个时间戳显示时间不同

识别用户所在时区,或者让用户主动设置自己所在时区。也就是会出现同一个时间戳,美国的时间显示比中国的晚13小时。

后端存储的数据为标准时间,不受时区影响的。

后端服务器存储的时间,建议存储为UTC标准时间戳,而不是某个时区的时间。

服务器与客户端不在同个时区

这个问题是会必然发生的,因为客户端肯定在不同的地区,默认手机或者电脑都会设置为当地的时区,而服务器一定不在于客户端设置的同个时区。

所以,为了保证客户端的时区的准确性,需要在服务端清楚的指导客户端所在的时区,具体有2种做法:

一种是基于业务的灵活调整,当用户时区变化时,就传给服务器所在的时区,用来差别处理。这种一般要做用户时区的检测,当用户时区变化时触发这个函数。相对比说,动态检测是困难的,所以一般是每次进入系统时,自动获取并设置一次用户当前所在的时区。

还有一种是用户自定义设置所在的时区,所有的时区相关接口,读取和返回时间时,需要查阅用户的时区。这种情况,每次都从数据库读取,当然更好的方式是读取缓存,因为时区更改一般是低频的。因此可把用户的维护时区放在缓存里维护并读取。

服务器之间在不同时区

保证不同服务器之间的传递和存储数据都是UTC时间,不要存储有时区差异的标准日期。

不同客户端在不同时区

比如a在一个时区,b在一个时区,这时候a给b发消息,必然会有时间差异。

此时,a发给服务器的应该是时间戳,发送成功时,按照服务器的时间反显翻译为本时区的时间。

服务器接受之后,给b发时间戳,b翻译被本地时区的时间。然后b给服务器发时间,也是本地时间戳给服务器。

当然更稳妥的方式是不管客户端的时间戳,只传递行为,然后服务器统一以事件到达服务器的时间获取时间戳,毕竟用户传递的时间可能是一个不准确或者不可信任的时间。

拓展

1 设置工作计划,比如设置八点上班,那么这个时间应该是包含了时间差异的么?

首先,我们先要明确需求,是什么情况下用户要切换时区。

如果是用户的业务切换到了另外一个时区,那么为了方方面面的时间都是一个正确的,可理解的,那么设置的时刻应该是符合当前时区的,也就是八点还应该是八点。

但如果用户只是出差,或者其他偶发因素导致的时区变化,那么当他切换到另外一个时区之后,其只是显示时间变为当地时区的差异时间,但实际业务的时间不受到任何影响。

2 还有一种特殊的工作计划,也就是跨天的工作计划,这种是有明确的时区差异的,你设置时区一的某个日期,这个日期在另外一个时区是要相差半天的。这种是否在自己的业务允许范围内需要做判定。如果不允许,那么识别用户所在时区之后,要提醒其正确的差异后时区日期。否则,就会导致期望的工作计划被延迟或者提前了。

更多

更多前端通识,公开课,欢迎参与报名《子曰的前端季度公开课》,分享的都是这种实用的通识,每个季度分享10-12场,场均9.9元。