php.ini默认时区与date.timezone

时间:2012-10-23 15:00:08

标签: php timezone

当我在两个不同的服务器上使用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

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

grep -r "date_default_timezone_set" *

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

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

更新

已加载的配置文件。

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

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

php -i results。

服务器#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 -iphpinfo()查看时,“默认时区”在服务器#2上不匹配。

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

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

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

6 个答案:

答案 0 :(得分:11)

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

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

  

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

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

答案 1 :(得分:5)

要检查的一些事项:

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

答案 2 :(得分: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')更改为您想要的时区。

Source

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

使用Ubuntu 14.0 LTS 我的案例中的默认时区设置为:

/etc/php5/cli/php.ini

然后我可以通过以下方式验证:

php -i | grep“timezone”

答案 5 :(得分:1)

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

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

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