将Laravel结果返回给用户时,时区显示不正确。
P粉536909186
P粉536909186 2023-07-27 11:05:57
0
1
563
<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>
P粉536909186
P粉536909186

全部回复(1)
P粉006977956

我使用了whereBetween方法,并使用用户的时区转换了一天的开始和结束时间。这样,数据库将根据用户的本地时间进行查询,您应该能够得到正确的结果。

$todayProcedures = Procedure::query()
    ->where('user_id', $user->id)
    ->whereBetween('procedure_time', [
        Carbon::now()->startOfDay()->setTimezone($user->timezone)->toDateTimeString(),
        Carbon::now()->endOfDay()->setTimezone($user->timezone)->toDateTimeString(),
    ])
    ->get();

在处理应用程序中的时间戳时,正确处理时区转换非常重要。为了确保一致性和准确性,请遵循以下准则:

  1. 数据库存储:始终使用UTC格式将时间戳存储在数据库中。这样做可以确保所有时间戳都是标准化的,与任何特定的时区无关。
  2. 查询时区转换:在查询数据库时进行时区转换,而不是在记录插入或更新时进行。通过这样做,您可以确保从数据库检索的数据在不考虑用户时区的情况下保持一致和准确。
  3. 基于用户时区的显示:在向用户显示时间戳或根据其时区偏好进行处理时,执行必要的转换。通过将时间戳调整为用户的时区,您可以提供更友好和本地化的体验。
遵循这些准则,您的应用程序将保持准确的时间戳数据,并在不同的时区提供一致的结果。


热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板