需要了解的重要信息:
数据库将用户时区偏移量存储为数字(例如: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');
举一些例子:
在这个例子中,'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 :(得分: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的小时数是一个坏主意。您无法正确计算夏令时。最好使用指定的时区或位置。