2013-12-11 53 views
0

我使用Postgres的下面的SQL查詢:傳球trunc_date Postgres的時間戳PHP的日期會導致錯誤的日期

SELECT 
    date_trunc('month', s.thedate), 
    r.rank, 
    COUNT(r.rank) 
FROM 
    serps s 
    LEFT JOIN ranks r ON r.serpid = s.serpid 
GROUP BY 
    date_trunc('month', s.thedate), s.thedate, r.rank 
ORDER BY 
    s.thedate ASC; 

,當我直接運行該查詢對數據庫,我得到的數據中的所有數據我需要和日期似乎是正確的(格式化在Y-m-d g:i:s)。

但是,當我使用PHP運行它時,Postgres而不是日期返回時間戳。

因此,當我在PHP date中使用該時間戳時,整個日期不正確。

例如:

第一行的Postgres顯示爲:

"2013-08-01 00:00:00, 36, 1"

但PHP接收:

"1375315200000, 36, 1"

當我嘗試這樣做:

echo date("Y-m-d", 1375315200000);

輸出是:的

2013-08-01

45552-01-02

,而不是起初我還以爲這是一個填充問題,也許?我放棄了3個零的時間戳這樣:

echo date("Y-m-d", 1375315200);

和回報:

2013-07-31

我的問題是:

1)是否只是一種巧合,經過下降三個零,時間戳代表存儲在數據庫中的實際日期前一天?

2)爲什麼Postgres正確解釋時間戳;而PHP不?根據文檔Postgres時間戳應該是unix時間戳格式。

+0

我懷疑有時區轉換的東西讓你在這裏。你的服務器上有'TimeZone'設置爲'UTC'嗎?您的服務器時區是否更改?問題中的字段是'timestamp'還是'timestamp with time-zone'類型? –

+0

我認爲這可能是問題所在。數據庫在亞馬遜,我懷疑時區是西雅圖的時區,而Web服務器在亞特蘭大。但爲什麼我必須從時間戳中刪除3個零才能使任何東西關閉?是因爲postgres時間戳是在幾毫秒?我認爲它和unix時間戳一樣。 – ILikeTacos

+0

當postgres發送'2013-08-01 00:00:00'時,這就是php收到的。如果你認爲php收到'1375315200000',請用一些代碼演示它,理想情況下是一個可重複的測試用例。 –

回答

1

它們返回的數字是在Unix時代的毫秒,而不是。在將數據提供給PHP之前,除以1000是必要的。

對於數據庫,請小心檢查它們的時間戳實際上是UTC/GMT還是已經偏移到服務器的時區。我見過都完成了。我的服務器位於加州,是MySQL時間戳的Pacific Time。注意將PHP時間戳記粘貼到數據庫中,然後使用SQL格式化,反之亦然。

+0

似乎是這種情況,如果是這種情況,我懷疑我應該調整我的PHP代碼date_default_timezone_set($ databaseTimezone),對不對?這樣我才能正確顯示日期。 – ILikeTacos

+0

PHP會認爲它收到的整數時間戳(現在大約13億)是GMT/UTC。最乾淨的事情可能是增加或減少數據庫時間戳的秒數來獲取GMT/UTC。但是,如果數據庫服務器服從DST而不是全年的標準時間,那可能會變得混亂。 –