2021-04-14 更新

整理之前的项目,使用 codeigniter 框架。在用户登录之后会更新以下最后登录时间,数据库里使用了 datetime 存储,查看记录发现,数据库写入的日期 2021-04-14 08:29:07 与当前系统显示的时间(当前东八区时间)相差(慢)了 6 个小时。网上查找资料,回顾了以下 php 中获取和设置时区的函数 date_default_timezone_get()date_default_timezone_set()

在准备使用设置时区函数(在入口文件中)设置当前时区时,忽然意识到,这个项目之前是不存在这样的问题的。那么是否是本地的 xampp 环境中的时区设置错误了呢?

打开 php.ini 文件,查找生效的 date.timezone 配置项(INI 文件中前面加 ; 表示注释)。发现默认时区显示的是 Europe/Berlin,将其修改为 Asia/Shanghai,保存文件,然后重启 apache 服务器。

再次登录后查看,数据库表中的时间显示与系统基本一致。


之前在 php -a 进入交互脚本输出当前日期时出现时间不准确的问题,在服务器上测试也是一样。

这是因为没有设置时区。

PHP 默认时区设置函数为 date_default_timezone_set(),版本支持:(PHP 5 >= 5.1.0, PHP 7)。

时区参数一般用 大洲/城市 表示时区,有三个表示东八区中国的参数 Asia/Hong_KongAsia/Shanghai Asia/Taipei

date_default_timezone_set('PRC');
date_default_timezone_set('Asia/Hong_Kong');
date_default_timezone_set('Asia/Shanghai');
date_default_timezone_set('Asia/Taipei');

还有一种直接跟数字挂钩的写法(格林威治时间):

date_default_timezone_set('Etc/GMT-8');

推荐拓展阅读:PHP中关于时间(戳)、时区、本地时间、UTC时间等的梳理