根据最佳实践,不直接修改php.ini
,而是使用单独的文件,我有以下文件:
$ cat /etc/php/7.0/apache2/conf.d/99-timezone.ini
[Date]
date.timezone="America/Los_Angeles"
我可以看到ini文件正在被加载,这张phpinfo屏幕截图证明了这一点。然而,在日期部分,两个指令中只有一个更新为显示America/Los_Angeles
,一个是UTC
。我甚至不知道UTC是从哪里来的,因为系统的时间不是UTC:
$ timedatectl
Local time: Tue 2017-11-07 18:36:56 PST
Universal time: Wed 2017-11-08 02:36:56 UTC
Timezone: America/Los_Angeles (PST, -0800)
(snip)
当我运行其中的每一个时,我都会看到以下输出:
var_dump(ini_get('date.timezone')); //string(19) "America/Los_Angeles"
var_dump(date_default_timezone_get()); //string(3) "UTC"
var_dump(date('e')); //string(3) "UTC"
如何将前两个时间拨到当地时间?
查看第二个屏幕截图,实现这一点的唯一方法(据我所知)是在运行时调用date_default_timezone_set('UTC');
。它会更改"默认时区",使其与.ini文件中的date.timezone
值不同。
因此,请查找以下内容:
-
.ini文件中的
auto_prepend_file=
。此指令会使脚本在处理的每个PHP文件之前自动预处理。如果它正在使用中,并且它加载的PHP文件设置了时区,则可能会导致这种情况。 -
你在使用PHP框架吗?如果是,请在框架的PHP文件中搜索
date_default_timezone_set
。例如,WordPress强制时区为UTC。 -
如果不使用框架,您是否使用任何可能包含
date_default_timezone_set
的PHP库。如果是这样的话,那可能就是问题所在。
它在phpinfo()
输出中显示为这样的事实表明它是一个auto_prepend_file
在做这件事,因为我假设你用一个只包含<?php phpinfo();
的文件检查phpinfo——没有框架或库