调整用户时区的数组输出

时间:2016-03-21 18:08:03

标签: php arrays timezone timezone-offset php-carbon

需要了解的重要信息:

  • 数据库将用户时区偏移量存储为数字(例如: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循环之前,应以某种方式处理信息。有没有人曾经处理过这个问题?谢谢!

2 个答案:

答案 0 :(得分: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" );

更改TimeZone:

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

您可以在所需的TimeZone中找到日期。

使用工作日名称:

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

使用0-24小时(w / out前导零):

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

您可以在php手册中找到完整的可用输出格式ad date()部分。

答案 1 :(得分: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的小时数是一个坏主意。您无法正确计算夏令时。最好使用指定的时区或位置。