日期函数忽略默认时区

date function disregards the default timezone

遵循不直接修改 php.ini 而是拥有单独文件的最佳实践,我有以下文件:

$ cat /etc/php/7.0/apache2/conf.d/99-timezone.ini
[Date]
date.timezone="America/Los_Angeles"

我可以看到正在加载 ini 文件,正如这个 phpinfo screenshot. However in the date section 所证明的那样,两个指令中只有一个更新为显示 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"

如何将前两个时间设为当地时间?

看看您的 second screenshot,(据我所知)发生这种情况的唯一方法是在运行时调用 date_default_timezone_set('UTC');。它改变了 'Default Timezone',导致它与 .ini 文件中的 date.timezone 值不同。

所以寻找像这样的东西:

  • auto_prepend_file= 在您的 .ini 文件中。该指令会导致在处理的每个 PHP 文件之前自动添加一个脚本。如果它正在使用并且它加载的 PHP 文件设置了时区,它可能会导致这种情况。

  • 您使用的是 PHP 框架吗?如果是这样,请在框架的 PHP 文件中搜索 date_default_timezone_set。例如,WordPress 将时区强制为 UTC。

  • 如果不使用框架,您是否使用任何可能包含 date_default_timezone_set 的 PHP 库。如果是这样,那就麻烦了。


它在您的 phpinfo() 输出中显示为这样的事实表明它是 auto_prepend_file 这样做的,因为我假设您正在检查 phpinfo一个只包含 <?php phpinfo(); 的文件——没有框架或库。