2016-03-03 20 views
0

我們正在將我們的域名轉移到我們最近購買的新專用服務器。新服務器的時區導致我們的附件php代碼出現一些問題。PHP的Unix時間戳年月日關閉

我們的論壇軟件使用下列文件夾結構存儲附件:

/的public_html /論壇/文件/ 2016/2月/ 14/[文件名]

年,從獲得的月和日文件上傳時間戳,它是一個Unix時間戳,例如「1455426488」。那麼這個時間戳轉換爲年,月,日使用下面的PHP代碼:

$date = getdate((int)$attachment['filetime']); 
$filepath = $config['upload_path'] . '/' . (string)$date['year'] . '/' . $date['month'] . '/' . (string)$date['mday']; 

這我們的舊服務器上運行良好,並收到了服務器,但在新服務器上的「天」是1天這會導致「2月14日」文件上傳到「2月13日」文件夾或「2月15日」文件夾中。請記住,該文件上傳時間爲1455426488在unix時間戳是02/14/2016在上午5:08 UTC時區。

有沒有人有任何建議如何解決這個問題?這是我們論壇系統的重要組成部分,所以如果沒有爲其提供解決方案,我們將無法遷移到新服務器。

感謝,

皮特

順便說一句,無論是舊的和新的服務器使用的是 「美國/芝加哥」 作爲自己的時區(CST)。

+0

你可以試試'$日期=(INT)$附件[ 'FILETIME']; (「Y」,$ date)。「/」。date(「F」,$ date)。「/」。date(「d」, $ date);' –

+0

什麼時區是PHP(美國/芝加哥?)什麼時區是服務器/操作系統(日期+%Z)? – user2182349

+0

@ user2182349 - PHP時區爲「America/Chicago」,服務器/操作系統時區爲「CST」。 –

回答

0

您可以使用DateTime類來轉換日期。

$date = new DateTime(null, new DateTimeZone('America/Chicago')); 
$date->setTimeStamp((int)$attachment['filetime']); 
$filepath = $config['upload_path'] . '/' . $date->format('Y') . '/' . $date->format('F') . '/' . $date->format('d'); 
+0

儘管您的建議確實減少了錯誤範圍,但並未完全消除所有錯誤。對於大約一半的文件您的建議工作,而另一半則沒有。 –

+0

如果你所有的'(int)$ attachment ['filetime']'都是UTC,它就會工作。所以我的問題是,你確定你所有的上傳時間都在同一個時區? – olibiaz

+0

我很確定所有文件時間都是UTC,因爲這個確切的設置是在以前的論壇上工作的。 –

0

我發現問題了!它看起來像下面這行已經找到了它的方式進入下載/ file.php文件:

date_default_timezone_set('GMT'); 

此行並沒有在原來的文件存在,那麼刪除它解決了這個問題!我仍然不確定這條線是如何添加的,但它解釋了怪異的行爲。

感謝, 皮特

+0

'date_default_timezone_set('GMT');'已經改變了PHP的時區,這會讓你在做完每一種PHP日期時間格式之後得到錯誤的時間。 –