2013-03-21 119 views
0

我在我的網站上顯示了最近14天(包括當天)每行都有一行的系統狀態表。然後,對於每一列,我從MySQL數據庫中選擇當天發生的任何事件。PHP切換時區/檢索MySQL數據

MySQL中的所有數據都以UTC格式存儲,PHP也在UTC下運行。我有兩個問題:

  1. 如果用戶在東部時間例如,電網正在更新顯示,即使它只是爲用戶東部明天晚上8點的日期。我想我已經解決了,通過這樣做:

    while ($i < 14) 
        {  
         //SET STATUS DATE 
         $status_date = date("Y-m-d H:i:s", strtotime("-$i day")); 
    
         //LOCALIZE TIMES  
         $status_date = new DateTime($status_date); 
         $status_date->setTimeZone(new DateTimeZone('America/New_York')); 
    
         echo $status_date->format("F j, Y"); 
        } 
    
  2. 我有下一個問題是關於搜索事件。每個事件都有數據庫中的INCIDENT_START場和我這樣的查詢:

    SELECT INCIDENT_STATUS FROM TABLE_system_status WHERE SYSTEM_AFFECTED='WEBSITE' AND INCIDENT_START BETWEEN '$start_time' AND '$end_time' ORDER BY INCIDENT_START DESC LIMIT 1 
    

這是我的問題。如果我使用$start_time = $status_date->format("Y-m-d 00:00:00")$end_time = $status_date->format("Y-m-d 23:59:59"),事件不會顯示在表格中的正確日期。

示例: 數據庫中的事件的INCIDENT_START時間爲2013-03-19 01:02:01 UTC,相當於2013-03-18 21:02:01 EDT。然而,在這種情況下,它仍然出現在我的表格的3月19日專欄中。

底線....我需要能夠在用戶的本地時間從00:00:00到23:59:59獲取事件,即使它們在數據庫中是UTC。我有一種感覺,我已經過分複雜了,但我嘗試了一堆不同的組合,似乎無法做到。真的很感謝任何幫助!

回答

0

你需要設置$status_date在用戶的本地時區,並轉換爲UTC。

$status_date = new DateTime("today -$i day", new DateTimeZone('America/New_York')); 
$status_date->setTimeZone(new DateTimeZone('UTC')); 

$start_time = $status_date->format("Y-m-d H:i:s"); 
$status_date->add(new DateInterval('PT23H59M59S')); 
$end_time = $status_date->format("Y-m-d H:i:s"); 
+0

謝謝回覆!我試過你的代碼,它似乎仍然給我在東部時間的開始/結束。 '$ status_date->格式輸出(「Y-m-d H:i:s T」)'產生2013-03-21 19:09:15 EDT。然後對於start_time我得到2013-03-21 00:00:00和end_time我得到2013-03-21 23:59:59。我不應該得到2013-03-21 04:00:00和2013-03-22 03:59:59哪些是UTC等值? – Jason 2013-03-21 23:10:13

+0

查看新的編輯。還有幾個問題。 – mcrumley 2013-03-22 16:29:00

+0

感謝一百萬 - 完美的工作。如果你有時間,你能解釋'DateInterval'('PT23H59M59S')'是爲我自己的教育做的嗎?我做了一些搜索,但找不到有用的東西。再次感謝! – Jason 2013-03-23 02:23:21