背景
今天脑子里突然冒出一个疑问,前段时间做golang的web项目,框架是iris,测试环境是docker,发现官方的golang的docker容器里面的时区是UTC时区和北京时间相差8h,后面貌似是:
$ docker run -d \
-e "TZ=Asia/Shanghai" \
...
即运行容器时,指定容器内的时区信息!解决了该问题!
探究
网上搜索全局设置golang 的时区信息,给出的方式是:通过自定义一个tzinit,时区初始化包,来实现时区的全局设置,init会在被其他包import时,自动调用inti()方法:
那以前做php时,使用的是php-fpm的镜像,框架用的是tp5,为毛没得时区的问题?
找到以前的开发环境,进入php-fpm的容器:
docker exec -it a567afd32fe3 /bin/bash
得到:
root@a567afd32fe3:/var/www/html# date
Thu Dec 10 06:02:27 UTC 2020
emmm,居然也是utc的时区,那为啥代码层面使用time()或date输出的时间是正确的北京时间呢?是谁帮我们转换了时区?
首先想到的是php.ini里面是否存在时区设置?
打开php.ini文件
查找:date.timezone
那么意思是不是在php.ini设置亚洲时区?还有谁能设置时区呢?首当其冲就是web框架了,使用phpstorm全局搜索一下:
date_default_timezone_set函数,该函数是设置php脚本的时区信息,会覆盖php.ini的设置!达到动态设置的目的!
那就水落石出了,就是tp框架帮我们做了时区的设置,是在web生命周期里面,初始化应用阶段做了时区的设置,设置为了Asia/Chongqing时间,也可以理解,毕竟是咱国人开源的框架,面向的用户都是中国人,使用Asia/Chongqing时区也是理所当然的。
参考文章:
https://blog.csdn.net/longgeaisisi/article/details/104215867
https://stackoverflow.com/questions/54363451/setting-timezone-globally-in-golang