【问题标题】:php.ini default timezone vs. date.timezonephp.ini 默认时区与 date.timezone
【发布时间】:2012-10-13 13:26:24
【问题描述】:

当我在两台不同的服务器上使用 PHP 的 date() 函数时,我得到了两个不同的结果,但两台服务器应该是相同的。

我检查了服务器 #1 上的 php.ini 文件,其中时间是正确的,它看起来如下:

date/time support                   enabled
"Olson" Timezone Database Version   0.system
Timezone Database                   internal
Default timezone                    America/Chicago

Directive        Local Value        Master Value
---------------------------------------------------
date.timezone    America/Chicago    America/Chicago

我检查了服务器 #2,它看起来如下:

date/time support                   enabled
"Olson" Timezone Database Version   0.system
Timezone Database                   internal
Default timezone                    UTC

Directive        Local Value        Master Value
---------------------------------------------------
date.timezone    America/Chicago    America/Chicago

我看到的唯一区别是“默认时区”值。

两台服务器的日期/时间当前显示为:

Server #1: 10/23/2012 09:40:39
Server #2: 10/23/2012 14:40:39

我确认两台服务器都使用位于/etc 内的php.ini,并且我还在这两个网络目录中搜索了时区可能被覆盖的任何地方:

grep -r "date_default_timezone_set" *

但在这方面,它们都包含具有相同设置的相同文件。

“默认时区”是什么导致了 5 小时的差异?如果是这样,我该如何纠正?

更新

已加载配置文件。

服务器 #2 包含两个额外的 ini 文件:

/etc/php.d/snmp.ini
/etc/php.d/apc.ini

php -i 结果。

服务器 #1:

date/time support => enabled
"Olson" Timezone Database Version => 0.system
Timezone Database => internal
Default timezone => America/Chicago

Directive => Local Value => Master Value
date.timezone => America/Chicago => America/Chicago

服务器 #2:

date/time support => enabled
"Olson" Timezone Database Version => 0.system
Timezone Database => internal
Default timezone => America/Chicago

Directive => Local Value => Master Value
date.timezone => America/Chicago => America/Chicago

这里需要注意的是,由于某种原因,在通过php -i 与网页上的phpinfo() 查看时,服务器#2 上的“默认时区”不匹配。

解决方案

问题出在 CMS 及其插件上。虽然服务器 #1 和 #2 具有相同的文件和所有内容,但似乎每个服务器上插件的加载顺序不同,这使得加载的最后一个插件可以确定我的脚本的时区。

php -iphpinfo 不同的原因是因为在您使用date_default_timezone_set() 之后,它会影响phpinfo() 将打印的内容。

解决方法是确保我处于我需要通过date_default_timezone_set() 进入的时区。在我发布这个问题之前对我不起作用的原因是因为我在从 CMS 加载一些必需的文件之前声明了这一点,这可能会在那里再次设置时区。

【问题讨论】:

  • 两台服务器的系统时间一样吗?
  • 将所有服务器配置为使用 UCT 作为其基准日期确实是个好主意。它让一切变得更加可预测。
  • @AlexLunix 是的,我刚刚检查过,它们都是一样的:Tue Oct 23 10:03:57 CDT 2012
  • @SDC 是的,我同意。在这一点上,我只是想让它们保持相同。如果可以,我可以将它们设置为 UTC。
  • 我也遇到了同样的问题,发现Laravel配置覆盖了php.ini默认时区

标签: php timezone


【解决方案1】:

date() 依赖于 date.timezone INI 设置。由于一个是芝加哥 (CT),另一个是 UTC,因此您的时差为 5 小时。

我相信 PHP > 5.2 你应该收到:

PHP 警告:未知:依赖系统的时区是不安全的 设置。您必须使用 date.timezone 设置或 date_default_timezone_set() 函数。

我建议您查看新的 DateTime 对象或按照 SDC 的建议使用 UTC。

【讨论】:

  • date.timezone 在 php.ini 中设置。并且它们在两台服务器上都设置为相同的值。我不确定“默认时区”的设置位置。
  • +1 用于推荐 DateTime 类。与旧的日期处理功能相比,它不会因为时区而陷入混乱。而且它的功能也更多。 date() 函数和它的朋友应该被扔进坑里,永远不要带回来。
  • 它没有设置在某处,因此服务器 #2 上的 Default timezone UTC
  • 我该去哪里设置呢?或者我在哪里可以在服务器 #1 上取消设置?
  • 你确定 INI 是一样的吗?在两台服务器上运行以下命令:php -i | grep timezone
【解决方案2】:

需要检查的几件事:

  1. 检查 phpinfo() 输出中的“加载的配置文件”值,确保更改正确的 php.ini 文件。 (这已经不止一次咬我了!)
  2. 查看 phpinfo() 输出时,请检查“已解析的其他 .ini 文件”行,以查看通过 Web 服务器运行时是否有其他 ini 文件正在解析。
  3. date.timezone 可以通过 ini_set 函数设置。你有任何代码可以做到这一点吗?请务必检查由于 auto_prepend ini 设置而可能正在运行的任何代码。

【讨论】:

  • [1.] 再次仔细检查,是的,它们都是从 /etc/php.ini 加载的 [2.] 我注意到在服务器 #2 上,还有两个额外的 ini 文件:snmp.iniapc.ini。 [3.] 我会搜索init_set(date.timezone 之类的东西吗?
  • [2] 这些 ini 文件不应该有 date.timezone 的任何内容,但我还是会检查一下。 [3] 关闭,寻找ini_set函数调用——php.net/ini_set
  • [2.] 我查看了这两个文件,其中没有关于时间的内容。 [3.] 我在两台服务器上都进行了搜索,我看到的唯一ini_set 函数与错误显示有关。
【解决方案3】:

代码如下:

[Date]
date.timezone = ('America/New_York')

date.default_latitude = 31.7667

date.default_longitude = 35.2333

date.sunrise_zenith = 90.583333

date.sunset_zenith = 90.583333

只需将date.timezone = ('America/New_York') 更改为您想要的时区。

Source.

【讨论】:

    【解决方案4】:

    http://us.php.net/manual/en/function.date-default-timezone-get.php

    TZ 环境优先于 php.ini 默认值;也许这就是原因。您可以通过显式调用 date_default_timezone_set 来解决此问题。

    【讨论】:

      【解决方案5】:

      使用 Ubuntu 14.0 LTS 在我的情况下,默认时区设置为:

      /etc/php5/cli/php.ini

      然后我可以验证:

      php -i | grep "时区"

      【讨论】:

      • 对于命令行界面 (cli) 是的。但是apache web php设置在/etc/php5/apache2/php.ini
      【解决方案6】:

      如果您在 php.ini 中设置了 date.timezone 值但它不起作用(即本地值和主值不同),那么您可能需要在 apache 配置文件中更新类似的内容:

      <IfModule mod_php5.c>
         php_value date.timezone "Europe/Paris"
      </IfModule>
      

      致之前删除上述答案的模组:我已经搜索了几个小时才能找到这个解决方案。不要仅仅因为您认为它是重复的答案而删除答案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-14
        • 2016-08-26
        • 2020-04-04
        • 2012-08-05
        • 2018-03-29
        相关资源
        最近更新 更多