2012-10-23 134 views
14

當我在兩臺不同的服務器上使用PHP的date()函數時,我得到兩個不同的結果,但兩臺服務器應該是相同的。php.ini默認時區與date.timezone

我檢查服務器#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 

我證實,這兩個服務器使用位於內/etcphp.ini我還搜查兩個網站目錄的時區可能會被覆蓋的任何地方:

​​

但是在這方面,它們都包含相同設置的相同文件。

是「默認時區」是什麼導致5h差異?如果是這樣,我該如何糾正它?

UPDATE

加載配置文件。

服務器#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 

有趣,這裏要注意的是,由於某種原因, 「默認時區」 不匹配服務器#2時通過php -i與網頁上的phpinfo()進行查看。

SOLUTION

的問題是與CMS和其插件。儘管服務器#1和#2具有相同的文件和所有內容,但似乎並未在每臺服務器上以相同順序加載插件,這允許加載最後一個插件來確定我的腳本的時區。

原因php -iphpinfo不同的是因爲在使用date_default_timezone_set()之後,它會影響打印的內容phpinfo()

修復是確保我在時區中需要通過date_default_timezone_set()。在我發佈這個問題之前沒有爲我工作的原因是因爲我在從CMS加載一些必需的文件之前宣佈了這一點,這可能會在其中再次設置時區。

+0

兩臺服務器上的系統時間是否相同? –

+1

將所有服務器配置爲使用UCT作爲其基準日期確實是一個好主意。它使一切變得更加可預測。 – SDC

+0

@AlexLunix是的,我剛剛查過,它們都是一樣的:'Tue Oct 23 10:03:57 CDT 2012' – NightHawk

回答

11

date()依賴於date.timezone INI設置。因爲一個是芝加哥(CT),另一個是UTC,那就是你的5小時差。

我相信作爲PHP> 5.2的你應該得到:

PHP的警告:未知:這是不是安全的依靠系統的時區設置 。您需要需要才能使用date.timezone設置或 date_default_timezone_set()函數。

我會鼓勵你看看新DateTime對象或使用UTC通過SDC的建議。

+0

'date.timezone'在php.ini中設置。它們在兩臺服務器上都設置爲相同的值。我不確定「默認時區」的設置。 – NightHawk

+0

+1用於推薦DateTime類。它不會像以前的日期處理函數那樣在時區中陷入混亂。而且功能也更強大。 'date()'函數和它的朋友應該被扔進坑裏,永遠不會回來。 – SDC

+0

它沒有設置在某個地方,因此服務器#2上的'默認時區UTC'。 –

5

有幾件事情要檢查:

  1. 檢查「加載的配置文件」的價值在你的phpinfo()輸出,以確保你改變了正確的php.ini文件。 (這已經讓我不止一次地咬過了!)
  2. 查看phpinfo()輸出時,請檢查「Additional .ini files parsed」行,以查看在通過Web服務器運行時是否還有其他ini文件正在被解析。
  3. date.timezone可以通過ini_set函數設置。你有沒有這樣的代碼?請務必檢查由於auto_prepend ini設置而可能正在運行的任何代碼。
+0

[1.]再次檢查一遍,是的,它們都是從'/etc/php.ini' [2]加載的。我注意到在#2服務器上有兩個額外的ini文件:'snmp.ini'和'apc.ini'。 [3.]我會搜索'init_set(date.timezone')嗎? – NightHawk

+0

[2]那些ini文件不應該有任何date.timezone,但我會檢查。[3]關閉,尋找ini_set函數調用 - http://php.net/ini_set – bradym

+0

[2]我查看了兩個文件,並且沒有關於它們的時間。[3]我在兩臺服務器上執行搜索,並且只執行了ini_set函數我看到與錯誤顯示有關 – NightHawk

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

+0

括號在第一行做了什麼?文檔沒有它們... –

1

用我的情況下Ubuntu的LTS 14.0默認 時區是在設置:

/etc/php5/cli/php.ini

然後我可以確認:

PHP -i | grep「timezone」

+0

對於命令行界面(cli)是的,但apache web php設置在/etc/php5/apache2/php.ini –

1

如果你在php.ini中設置了date.timezone的值,但它不起作用(即本地值和主值不同),那麼你可能需要在你的apache配置文件中更新這樣的東西:

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

對於之前刪除上述答案的mod:我已經搜索了幾個小時來找到這個解決方案。不要因爲您認爲這是一個重複的答案而刪除答案。