之前做过一个游戏数据分析项目,需要在一个系统里面接收来自不同地区(时区)的游戏数据,然后将数据存入clickhouse,最终使用clickhouse数据做数据分析。
游戏数据各种各样,最重要的就是时间参数了,因为游戏可能部署在全球各个地区,所以时区各有不同,怎么样才能在一个系统里面实现处理不同地区(时区)的游戏数据存储呢?
想到的解决办法就是就是在接收游戏数据上报的时候,在路由中间件(laravel框架)中,将当前PHP运行环境及当前MySQL会话的时区设置为和游戏一样的时区,然后各自处理游戏数据。
下面的代码,比较简陋,具体实现,需要根据自己项目的情况,自行补充完善,本文只简单列举上海时区,纽约时区,东京时区场景:
# 美国-纽约时区(冬令时/夏令时)
## 设置PHP时区
date_default_timezone_set('America/New_York');
## 设置MySQL时区
set time_zone='-5:00'; // 冬令时
set time_zone='-4:00'; // 夏令时
## 或者
## MySQL如果要考虑使用DST,确保你的MySQL版本是5.7.18或更高,因为之前的版本不支持自动处理DST转换。
## 在设置时区时,使用IANA时区数据库中的时区字符串,这样可以保证时区的准确性和可靠性。
## 设置MySQL当前会话的时区为纽约时间,并且开启DST自动转换
SET time_zone = 'America/New_York';
# 中国-上海时区
## 设置PHP时区
date_default_timezone_set('Asia/Shanghai');
## 设置MySQL时区
set time_zone='+8:00';
## 或者
set time_zone='Asia/Shanghai';
# 日本-东京时区
## 设置PHP时区
date_default_timezone_set('Asia/Tokyo');
## 设置MySQL时区
set time_zone='+9:00';
## 或者
set time_zone='Asia/Tokyo';
经过实践及线上运行了几年,确认可行,当然大家有什么更好的方法,也可以说一下,共同学习成长。
因为不常写文章,描述上有什么不清晰的地方,也请大家见谅,谢谢!