背景
不同时区,对同一时刻的显示是不同的。
服务器与客户端可能不在一个时区。
服务器之间,也可能在不同时区。
不同客户端不在同个时区。
不同时区都会有同一个日期,对应的周几也是相同的,但是这个日期对应的时间戳是不同的。
具体解决思路
对同一个时间戳显示时间不同
识别用户所在时区,或者让用户主动设置自己所在时区。也就是会出现同一个时间戳,美国的时间显示比中国的晚13小时。
后端存储的数据为标准时间,不受时区影响的。
后端服务器存储的时间,建议存储为UTC标准时间戳,而不是某个时区的时间。
服务器与客户端不在同个时区
这个问题是会必然发生的,因为客户端肯定在不同的地区,默认手机或者电脑都会设置为当地的时区,而服务器一定不在于客户端设置的同个时区。
所以,为了保证客户端的时区的准确性,需要在服务端清楚的指导客户端所在的时区,具体有2种做法:
一种是基于业务的灵活调整,当用户时区变化时,就传给服务器所在的时区,用来差别处理。这种一般要做用户时区的检测,当用户时区变化时触发这个函数。相对比说,动态检测是困难的,所以一般是每次进入系统时,自动获取并设置一次用户当前所在的时区。
还有一种是用户自定义设置所在的时区,所有的时区相关接口,读取和返回时间时,需要查阅用户的时区。这种情况,每次都从数据库读取,当然更好的方式是读取缓存,因为时区更改一般是低频的。因此可把用户的维护时区放在缓存里维护并读取。
服务器之间在不同时区
保证不同服务器之间的传递和存储数据都是UTC时间,不要存储有时区差异的标准日期。
不同客户端在不同时区
比如a在一个时区,b在一个时区,这时候a给b发消息,必然会有时间差异。
此时,a发给服务器的应该是时间戳,发送成功时,按照服务器的时间反显翻译为本时区的时间。
服务器接受之后,给b发时间戳,b翻译被本地时区的时间。然后b给服务器发时间,也是本地时间戳给服务器。
当然更稳妥的方式是不管客户端的时间戳,只传递行为,然后服务器统一以事件到达服务器的时间获取时间戳,毕竟用户传递的时间可能是一个不准确或者不可信任的时间。
拓展
1 设置工作计划,比如设置八点上班,那么这个时间应该是包含了时间差异的么?
首先,我们先要明确需求,是什么情况下用户要切换时区。
如果是用户的业务切换到了另外一个时区,那么为了方方面面的时间都是一个正确的,可理解的,那么设置的时刻应该是符合当前时区的,也就是八点还应该是八点。
但如果用户只是出差,或者其他偶发因素导致的时区变化,那么当他切换到另外一个时区之后,其只是显示时间变为当地时区的差异时间,但实际业务的时间不受到任何影响。
2 还有一种特殊的工作计划,也就是跨天的工作计划,这种是有明确的时区差异的,你设置时区一的某个日期,这个日期在另外一个时区是要相差半天的。这种是否在自己的业务允许范围内需要做判定。如果不允许,那么识别用户所在时区之后,要提醒其正确的差异后时区日期。否则,就会导致期望的工作计划被延迟或者提前了。
更多
更多前端通识,公开课,欢迎参与报名《子曰的前端季度公开课》,分享的都是这种实用的通识,每个季度分享10-12场,场均9.9元。