2012-11-03 20 views
1

我昨晚花了8個多小時來檢查所有的文檔,瀏覽各種帖子等,我幾乎解決了我的問題,但仍然有一些遺漏,我不明白。使用unix時間,php,mysql的時區問題

我有一個表,它存儲了各種用戶提交的unix時間戳(例如1351867293)。我正在提取這些信息並對它進行計算,以便獲得「今天」,「昨天」,「本週」等提交內容的總數。

我使用的代碼(「今日提交」)是:

WHERE DATE(from_unixtime(comment_date)) = CURRENT_DATE"; 

到目前爲止好,但有一個時間偏移和不正確顯示的數據。這裏的用戶在stackoverflow建議使用CONVERT_TZ爲了得到固定的偏移量。

這裏是我卡住的地方。我位於CST時區,我的服務器似乎位於EST時區。所以我用這個代碼

WHERE DATE(CONVERT_TZ(from_unixtime(comment_date), 'EST', 'CST')) = CURRENT_DATE"; 

...但它顯示我只有「0」,因此,儘管我今天提交了意見。我嘗試了不同的時區,但他們都給我「0」作爲結果。例如:當我用數字替換EST和CST時,例如:

WHERE DATE(CONVERT_TZ(from_unixtime(comment_date), '+00:00', '+07:00')) = CURRENT_DATE"; 

...我得到一個數字輸出,但數字並不正確。我嘗試了很多組合,包括+08:00,-05:00,但似乎沒有任何工作。

基本上我所要求的是爲了得到正確的結果,我必須將這兩個數字放在哪些值中?我的網站上的其他一切工作和正確顯示在我的時區(CST),我只有這個查詢的問題。

我的服務器的IP是50.116.13.130如果有幫助。

回答

0

請注意,除非您使用JavaScript,否則您的位置並不重要。這是重要的服務器位置。所以,如果你在CST,並且你的服務器在EST,那麼你所有操作的時間將在EST,因爲PHP是服務器端。

我認爲最好的方法是使用UTC時間。您可以使用您的服務器重置爲UTC:

date_default_timezone_set("UTC"); 

一旦UTC設置,所有的時間已復位從UTC 0轉變,它會更容易處理。我個人使用下面的函數PHP之間進行切換和MySQL日期

$mysqldate = date('Y-m-d H:i:s', $phpdate); 
$phpdate = strtotime($mysqldate); 

但同樣,你可以使用時間戳。這article可能會爲您提供一些答案

我不知道我回答你的問題,但我希望那些是你的指針。

乾杯。

0

Unix時間戳總是以UTC表示,因此無論您的服務器設置爲什麼時區。

但是,你必須確保你轉換使用正確的時區的「COMMENT_DATE」字符串表示:

// Use the timezone you are in (CST). If you're having user 
// submissions from all over the world, use the timezone 
// from where the submission came from. 
$timezone = new DateTimeZone("CST"); 
$date = new DateTime("2012-01-02", $timezone); 
$unixTimestamp = $date->getTimestamp(); 

另一個重要的事情是要注意到,「2012-01-02」將被轉換成「2012-01-02 00:00:00」。和「2012-01-02 00:00:00」!=「2012-01-02 04:03:27」。

所以,當你想今天的日期你應該查詢一個時間間隔。

$today = new DateTime(); // Get current time 
$today->setTimezone(new DateTimeZone("CST")); 
$today->setTime(0,0,0); // Set time to midnight of today (depends on your definition of today, could also be -24h 

$sql = "[..] WHERE comment_date > ".$today->getTimestamp(); 
+0

我的問題是,我有這行**在60多個文件中的WHERE DATE(CONVERT_TZ(from_unixtime(comment_date),'$ timezone1','$ timezone2'))= CURRENT_DATE「; ** _ $ timezone1_和_ $ timezone2_是通過header.php解析的 - 所以我必須使用數字值。我早些時候嘗試過你的方法,但它弄亂了我網站的其他日期時間顯示 - 我使用的後端正常地轉換時區,唯一的我有這個自定義代碼的統計數據 - 這是唯一弄亂時區 –

+0

好的,我明白了。但是,如果你在DATE(CONVERT_TZ(from_unixtime(comment_date),'EST','CST')選擇語句。 ),它會給你所期望的嗎? – luttkens

+0

nope,由於某些原因,我不能使用「EST」或「CST」,唯一的工作是數值如「+05:00」或「-06:00」 。 –

-1

我終於用

$timezone1 = '+12:00'; 
    $timezone2 = '-04:00'; 

DATE(CONVERT_TZ(from_unixtime(comment_date), '$timezone1', '$timezone2')) = CURRENT_DATE"; 

爲了得到我的8小時時差工作解決它。它適用於所有邏輯,因爲我的服務器時間是UTC(+0小時),輸出應該是CST(+8小時)。所以基本上

$timezone1 = '+00:00'; 
    $timezone2 = '+08:00'; 

應該得到我想要的結果,但它沒有。我不知道爲什麼,但我很高興我現在第一次引用代碼。