ホームページ  >  に質問  >  本文

Laravel の結果をユーザーに返すときに、タイムゾーンが正しく表示されません。

<p>Laravel API を使用していますが、アプリケーションのタイムゾーンは UTC に設定されています。 MySQL のタイムゾーンは SYSTEM に設定されており、これは UTC とも表されます。また、users テーブルには、ユーザーのタイムゾーン情報を保存する列もあります。 <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粉536909186P粉536909186471日前539

全員に返信(1)返信します

  • P粉006977956

    P粉0069779562023-07-28 09:50:53

    whereBetween メソッドを使用し、ユーザーのタイムゾーンを使用して 1 日の開始と終了を変換しました。こうすることで、ユーザーの現地時間に基づいてデータベースがクエリされ、正しい結果が得られるはずです。

    リーリー

    アプリケーションでタイムスタンプを扱う場合、タイムゾーン変換を正しく処理することが重要です。一貫性と正確性を確保するには、次のガイドラインに従ってください。

    1. データベース ストレージ: タイムスタンプは常に UTC 形式を使用してデータベースに保存します。これにより、特定のタイムゾーンに関係なく、すべてのタイムスタンプが標準化されます。
    2. クエリのタイム ゾーン変換: タイム ゾーンの変換は、レコードの挿入または更新時ではなく、データベースのクエリ時に実行されます。これにより、ユーザーのタイムゾーンに関係なく、データベースから取得されるデータの一貫性と正確さが保証されます。
    3. ユーザー タイム ゾーン ベースの表示: ユーザーにタイムスタンプを表示するとき、またはユーザーのタイム ゾーン設定に基づいて処理するときに、必要な変換を実行します。タイムスタンプをユーザーのタイムゾーンに調整することで、よりユーザーフレンドリーでローカライズされたエクスペリエンスを提供できます。
    これらのガイドラインに従うと、アプリケーションは正確なタイムスタンプ データを維持し、異なるタイム ゾーン間でも一貫した結果を提供します。


    返事
    0
  • キャンセル返事