14

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

我检查了php.ini服务器 #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                    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

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

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值得注意的是,由于某种原因,“默认时区”在服务器#2 上与phpinfo()通过网页查看时不匹配。

解决方案

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

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

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

4

6 回答 6

11

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

我相信从 PHP > 5.2 开始,您应该收到:

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

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

于 2012-10-23T15:04:35.963 回答
5

需要检查的几件事:

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

这是代码:

[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')为您想要的时区。

来源

于 2013-12-20T19:20:15.280 回答
1

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

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

于 2013-08-26T08:02:54.143 回答
1

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

/etc/php5/cli/php.ini

然后我可以验证:

php -i | grep“时区”

于 2014-10-28T13:03:53.150 回答
1

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

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

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

于 2015-08-18T02:11:06.357 回答