Bei der Rückgabe von Laravel-Ergebnissen an den Benutzer wird die Zeitzone falsch angezeigt.
P粉536909186
P粉536909186 2023-07-27 11:05:57
0
1
585
<p>Ich habe eine Laravel-API und die Zeitzone der Anwendung ist auf UTC eingestellt. Die Zeitzone von MySQL ist auf SYSTEM eingestellt, was auch als UTC ausgedrückt wird. Ich habe auch eine Spalte in der Benutzertabelle, in der die Zeitzoneninformationen des Benutzers gespeichert sind. <br /><br />Meine Front-End-Schnittstelle verfügt über ein Feld, in das der Benutzer ein Datum/eine Uhrzeit als Uhrzeit eines bestimmten Prozesses eingeben kann. Diese Zeit wird in der Zeit des Benutzers an die API gesendet Zone. Wenn dieser Datensatz gespeichert ist, konvertiere ich ihn in UTC und füge ihn dann wie folgt in die Datenbank ein: </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>Ich versuche, Datensätze aller Benutzerprozesse für den aktuellen Tag in der Zeitzone des aktuellen Benutzers abzurufen und diese Ergebnisse an das Frontend zurückzugeben. Ich dachte, die Ergebnisse seien korrekt, aber als mein Computer Mitternacht erreichte, zeigten die Ergebnisse etwa zehn Stunden lang immer noch die Aufzeichnungen des Vortages an. So versuche ich, diese Ergebnisse zurückzugeben;</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>Ich kann nicht herausfinden, wo ich einen Fehler gemacht habe. </p>
P粉536909186
P粉536909186

Antworte allen(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. 基于用户时区的显示:在向用户显示时间戳或根据其时区偏好进行处理时,执行必要的转换。通过将时间戳调整为用户的时区,您可以提供更友好和本地化的体验。
遵循这些准则,您的应用程序将保持准确的时间戳数据,并在不同的时区提供一致的结果。


Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage