将Laravel结果返回给用户时,时区显示不正确。
P粉536909186
2023-07-27 11:05:57
<p>我有一个Laravel API,应用程序的时区设置为UTC。MySQL的时区设置为SYSTEM,也表示为UTC。我还在用户表中有一个列,用于存储用户的时区信息。<br /><br />我的前端界面有一个字段,用户可以输入一个日期/时间作为某个过程的时间,这个时间会以用户的时区发送到API。因此,当保存该记录时,我会将其转换为UTC,然后插入到数据库中,如下所示;</p><p><br /></p>
<pre class="brush:php;toolbar:false;">auth()->user()->procedure()->create([
'procedure_time' => Carbon::parse($request->procedure_time, auth()->user()->timezone)->setTimezone('UTC'),
]);
</pre>
<p>我正在尝试获取当前用户时区下当天所有用户过程的记录,并将这些结果返回到前端。我以为结果是正确的,但当我的电脑到午夜时,结果仍然显示为前一天的记录,持续了大约10个小时左右。这是我尝试返回这些结果的方式;</p>
<pre class="brush:php;toolbar:false;">$todayProcedures = Procedure::query()
->where('user_id', $user->id)
->whereDate('procedure_time', '>=', Carbon::now()->startOfDay()->tz($user->timezone))
->whereDate('procedure_time', '<=', Carbon::now()->endOfDay()->tz($user->timezone))
->get();
</pre>
<p>我无法找出我错在哪里。</p>
我使用了whereBetween方法,并使用用户的时区转换了一天的开始和结束时间。这样,数据库将根据用户的本地时间进行查询,您应该能够得到正确的结果。
在处理应用程序中的时间戳时,正确处理时区转换非常重要。为了确保一致性和准确性,请遵循以下准则: