Laravel Auth 用户时区中的 WhereDate 过滤器

Laravel WhereDate Filter in Auth User Time zone

我的默认 Laravel 应用程序时区是 America/Los_Angeles (pst),我在数据库中存储了所有时间戳 created_at 和这个时区。

在用户配置文件中,我们提供 select 时区的选项。在显示旅行列表中的数据列表时,我正在转换并显示创建于每个用户 selected 时区 ( $date->setTimezone($user->timezone);)

例如,如果行程 ID 197created_at 2020-06-11 23:00:00 存储在数据库中(根据默认应用程序时区,即 pst),而在列表中我我正在显示 2020-06-12 02:00:00(根据用户配置文件提前 3 小时估计的时区)。

现在一切正常,直到我不得不在列表中添加日期范围(开始和结束日期)过滤器。问题是,如果我在过滤器中 selecting 开始日期 2020-10-12,结果它没有得到 197 行程 ID,因为在数据库中它存储为 2020-06-11 23:00:00.,这条 197 id 记录应该在过滤后的列表中,因为根据 auth 用户时区,该行程是在 2020-06-12 添加的。我的数据库查询是 $trips->whereDate('created_at', '>=' ,$request->start_date);。我有唯一的日期而不是请求过滤行程的时间我需要以某种方式在此查询中传递时区,或者是否有更好的解决方案。日期过滤器应根据用户 selected timezone

工作

如果 table 中的 1 列可以有不同的时区,则需要 dateTimeTz 为每一行存储日期时间和时区。

有了这个,whereDate 将使用存储的时区,然后您可以根据需要重新转换到任何其他时区而不会丢失。

如果有人遇到类似问题,以下是我找到的答案 通常对于日期范围过滤器,您需要确保将开始日期时间设置为 00:00 并将结束日期时间设置为 23:59

if($request->filled('start_date'))
{
    // $request->start_date;
    $date = Carbon::parse($request->start_date, auth()->user()->timezone)
        ->startOfDay()
        ->setTimezone(config('app.timezone'));

    $brokers->where('created_at', '>=' ,$date);
}

if($request->filled('end_date'))
{
    $end_date = Carbon::parse($request->end_date, auth()->user()->timezone)
        ->endOfDay()
        ->setTimezone(config('app.timezone'));
    $brokers->where('created_at', '<=' ,$end_date);
}