php 返回用户时区的laravel结果不能正确反映

wswtfjt7  于 2023-08-02  发布在  PHP
关注(0)|答案(1)|浏览(100)

我有一个laravel API,应用程序的时区设置为UTC。MySQL被设置为SYSTEM,这表明它也是UTC,我在我的users表上也有一个列,这是users的时区。
我的前端有一个字段,用户可以输入一个过程的日期/时间,这被发送到用户时区的API。因此,当保存该记录时,我转换为UTC,然后像这样插入到DB中;

auth()->user()->procedure()->create([
    'procedure_time' => Carbon::parse($request->procedure_time, auth()->user()->timezone)->setTimezone('UTC'),
]);

字符串
我试图获得所有用户程序的记录,为当天在该用户时区,然后返回这些结果到前端,我认为我有正确的结果,但当它击中午夜在我的PC,结果仍然显示前一天约10小时左右后,它击中午夜。这就是我试图返回那些结果的方式;

$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();


我不知道我错在哪里。

h43kikqp

h43kikqp1#

我使用了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格式在数据库中存储时间戳。这种做法确保所有时间戳都是规范化的,并且独立于任何特定的时区。
1.查询时区转换:在查询数据库时执行时区转换,而不是在记录插入或更新期间执行。通过这样做,可以确保从数据库检索的数据保持一致和准确,而与用户的时区无关。
1.基于用户时区的显示:向用户显示时间戳或根据用户的时区首选项处理时间戳时,请执行必要的转换。通过调整时间戳以适应用户的时区,您可以提供更加用户友好和本地化的体验。
通过遵守这些实践,您的应用程序将维护准确的时间戳数据,并在不同的时区提供一致的结果。

相关问题