2016-03-21 78 views
0

重要信息知道:調整陣列輸出用於用戶時區

  • 數據庫存儲用戶時區作爲數字偏移(例如:在EST用戶具有一個時區柱值-4"

  • 服務器時間爲UTC

我回國與工作日和小時顯示它的希望分組集合數據查詢在熱圖上。

到目前爲止,這是我的。

$timezone = Auth::user()->timezone; 

$week_data = DB::select('SELECT COUNT(id) as total, WEEKDAY(created_at) AS week_day ,HOUR(created_at) as hours 
FROM messages 
GROUP BY week_day, hours'); 

一些例子: enter image description here

在該示例

,「WEEK_DAY」是星期幾(0 =星期一,6 =星期日)的數字表示 和小時是一種數字表示在一天中的小時(以24小時格式)

目前,隨着week_day-> 2和小時 - >裝置23星期三的對象在下午11點IN UTC

獲得查詢結果後,我使用foreach循環,其中$ new_array是我以前實例化的變量(未顯示)

foreach ($week_data as $data) 
    { 
     if ($data->week_day == 0) 
     { 
      $new_array['Monday'][$data->hours] = $data; 
     } 
     elseif ($data->week_day == 1) 
     { 
      $new_array['Tuesday'][$data->hours] = $data; 
     }elseif ($data->week_day == 2) 
     { 
      $new_array['Wednesday'][$data->hours] = $data; 
     } elseif ($data->week_day == 3) 
     { 
      $new_array['Thursday'][$data->hours] = $data; 
     } 
     elseif ($data->week_day == 4) 
     { 
      $new_array['Friday'][$data->hours] = $data; 
     } 
     elseif ($data->week_day == 5) 
     { 
      $new_array['Saturday'][$data->hours] = $data; 
     } 
     elseif ($data->week_day == 6) 
     { 
      $new_array['Sunday'][$data->hours] = $data; 
     } 
    } 

現在的數據分離,我試圖找到一種方法,我可以調整陣列數據反映用戶時區的偏移量。因此,信息應該以某種方式在與開關盒一起到達foreach循環之前進行處理。有沒有人曾經處理過這個問題?謝謝!

回答

0

在這個例子中,我將使用這些變量:

$week_day = 1; 
$hours = 23; 
$TimeZone = -4; 

填充數組與周名天相干的周制(本例中有0 =週一,6 =週日):

$weekdays = [ 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday' ]; 

創建新的UTC DateTime對象:

$date = new Datetime("{$weekdays[$week_day]}, {$hours}:00 UTC"); 

更改時區:

$date->setTimezone(new DateTimeZone($TimeZone)); 

並且您在所需的時區中有日期。

要使用星期幾名稱:

$weekday_name = $date->format('l'); 

要使用0-24小時(瓦特/前導零):

$hour = $date->format('G'); 

你可以找到完整的可用輸出格式廣告date()節的PHP手冊。

0

MySQL的CONVERT_TZ函數將DATETIME值從一個時區轉換爲另一個時區。如果您在選擇數據時使用此函數,則根本不需要更改PHP代碼。

如果用戶輸入了$timezone,則需要編輯此代碼以防止SQL注入。我不適合你的數據庫抽象庫,否則我會爲你做。

$timezone = Auth::user()->timezone; 

$week_data = DB::select(" 
    SELECT COUNT(id) as total, 
      WEEKDAY(CONVERT_TZ(created_at, '+0:00', '$timezone:00')) AS week_day, 
      HOUR(CONVERT_TZ(created_at, '+0:00', '$timezone:00')) AS hours 
    FROM messages 
    GROUP BY week_day, hours"); 

但是,將用戶的時區存儲爲UTC的小時數是個壞主意。夏令時無法正確記帳。最好使用命名的時區或位置。