Auth 用户时区中的 LaravelWhereDate 过滤器

kun*_*put 1 timezone laravel php-carbon

我的默认 Laravel 应用程序时区是America/Los_Angeles (pst),我将所有时间戳存储created_at在数据库中,就像该时区一样。

在用户个人资料中,我们提供了选择时区的选项。在显示数据列表时,例如在旅行列表中,我正在转换并显示根据用户选择的时区创建的数据 ( $date->setTimezone($user->timezone);)

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

现在一切正常,直到我必须在列表中添加日期范围(开始和结束日期)过滤器。问题是,如果我在过滤器中选择开始日期 2020-10-12,结果它不会获取197行程 id,因为在数据库中它存储为 2020-06-11 23:00:00。,这个 197 id记录应该出现在过滤器之后的列表中,因为根据身份验证用户时区,该行程是在 2020 年 6 月 12 日添加的。我的数据库查询是$trips->whereDate('created_at', '>=' ,$request->start_date);. 我只有日期而不是时间来请求过滤器旅行,我需要以某种方式在此查询中传递时区,或者是否有更好的解决方案。日期过滤器应根据用户选择的时区工作

kun*_*put 5

如果有人遇到类似的问题,以下是我发现的答案一般对于日期范围过滤器,您\xe2\x80\x99会想要确保\xe2\x80\x99将开始日期时间设置为00:00,结束日期时间设置为23:59

\n
if($request->filled('start_date'))\n{\n    // $request->start_date;\n    $date = Carbon::parse($request->start_date, auth()->user()->timezone)\n        ->startOfDay()\n        ->setTimezone(config('app.timezone'));\n\n    $brokers->where('created_at', '>=' ,$date);\n}\n\nif($request->filled('end_date'))\n{\n    $end_date = Carbon::parse($request->end_date, auth()->user()->timezone)\n        ->endOfDay()\n        ->setTimezone(config('app.timezone'));\n    $brokers->where('created_at', '<=' ,$end_date);\n}\n
Run Code Online (Sandbox Code Playgroud)\n