2016-03-21 4 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 =日)の数値表現でありますUTC IN(24時間形式)一日の時間の現在

、11PM でweek_day-> 2とhours-> 23件の手段を持つオブジェクト水曜日の

クエリ結果を取得した後、私は私が配列さを調整することができる方法を見つけようとしています、

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; 
     } 
    } 

(図示せず)の$ new_arrayは、私が以前にインスタンス変数であるforeachループを使用してデータを分離データは、ユーザーのタイムゾーンのオフセットを反映します。したがって、スイッチのケースで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)); 

希望するタイムゾーンに日付があります。あなたは完全な利用可能な出力形式の広告date()セクションを見つけることができます

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

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

は(アウト先行ゼロ/ w)は0-24時間を使用するには:

は曜日名を使用するにはphpマニュアルの

0

MySQLのCONVERT_TZ関数は、DATETIMEの値をあるタイムゾーンから別のタイムゾーンに変換します。データを選択するときにこの関数を使用すると、PHPコードをまったく変更する必要はありません。

$timezoneが入力されている場合は、このコードを編集してSQLインジェクションを防止する必要があります。私はあなたのデータベース抽象化ライブラリを使用していないのですが、そうでなければあなたのためにやったでしょう。 UTCからの時間数など、ユーザーのタイムゾーンを保存

$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"); 

はしかし、悪い考えです。あなたは、夏時間に正しく対応することができません。名前付きのタイムゾーンまたは場所を使用する方がよいでしょう。

関連する問題