你知道程序都是怎么处理时区问题的么?
你知道程序都是怎么处理时区问题的么?https://blog.csdn.net/qq_35190492/article/details/112912039
跨境系统的时间处理
上面介绍的意大利罗马的税务系统,其实属于政企业务,只服务于国内的用户的需求,不涉及海外用户的请求,相对来说地区和人员都比较固定,但是像这种跨境电商巨头ebay,它服务的用户遍布全球各地,而且每个地区的时区不同,同时每个时区的夏令时DST的起始时间也不一样,我们要解决的是要根据客户所在地区显示正确的时间(包括DST),跟前面的DST处理一样也涉及到三端处理:前端服务(frontend-service),后端服务(backend-service)以及MySQL数据库(mysql-server)。
从这个图上可以看到,前端服务的UI层跟用户所在的地区时间要完全一致,至于后端服务和MySQL如何处理时间,对于用户来说根本不关心的,这就要求前端必须要根据不同地区,不同时区,不同夏令时DST产生不同的时间的用户进行转换处理,不同地区的时间转换目前前端(Vue/React)已经有现成的插件可直接使用。
同时希望只在前端处理用户时间的转入和转出,后端和MySQL数据库不做任何修改就能完成业务处理和数据存储。
北京用户在UTC + 8也就是东八区,而罗马用户在UTC + 1东一区,都是在UTC的基础上做处理,那我们就可以将时区都设置为UTC,然后根据用户所在地区进行相应的处理。
MySQL处理
设置MySQL数据库的时区为UTC,不管用户来自哪个地区存储在数据库的时间都是UTC,包括公共时间字段(创建时间,修改时间)以及业务时间字段(交易开始时间,交易结束时间)。
-- 设置数据库时区为UTC,即零时区
set global time_zone = 'UTC'
后端处理
MySQL时区是UTC,那么后端服务的所在的Linux Server时区统一设置为UTC,跟MySQL保持一致,这样后端就不需要做任何转换。
前端处理
前端拿到标准时区UTC的数据,统一根据用户所在时区进行转换,这样保证与后端数据时区的一致性,前端根据实际情况进行渲染。一般来讲,前端将时间数据传递到后端,后端封装成timestamp后存储在MySQL中对应timestamp类型(MySQL中的timestamp是不区分时区的,例如数据库是UTC 02:00:00,北京用户使用ebay在CST 10:00:00下单,数据库中的订单表的create_time就应该存储2020-12-03 10:00:00),同时前端查询数据的也要做相应的转换处理。
定时任务
后端服务一般都会一些定时任务,这个时间一般取自Linux OS的时间,跟前端没关系,基于Linux的UTC时区做相应的调整即可。
总结
上面介绍了夏令时,闰秒以及跨境系统的时间处理问题,主要涉及到MySQL数据库,后端服务以及前端服务三个层面,对于夏令时,闰秒的转换处理,Linux和MySQL都可以自动完成处理,不需要额外转换;对于跨境系统的时间处理,通过设置Linux和MySQL时区为UTC,只需要前端服务处理不同地区用户时间问题,降低了系统改造的风险,今天就聊这么多,希望对大家有所帮助。