首頁  >  問答  >  主體

將Laravel結果傳回給使用者時,時區顯示不正確。

<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粉536909186P粉536909186471 天前540

全部回覆(1)我來回復

  • P粉006977956

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

    我使用了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. 基於使用者時區的顯示:在向使用者顯示時間戳記或根據其時區偏好進行處理時,執行必要的轉換。透過將時間戳調整為使用者的時區,您可以提供更友善和在地化的體驗。
    遵循這些準則,您的應用程式將保持準確的時間戳數據,並在不同的時區提供一致的結果。


    回覆
    0
  • 取消回覆