我有一個Laravel API,應用程式的時區設定為UTC。 MySQL的時區設定為SYSTEM,也表示為UTC。我還在用戶表中有一個列,用於儲存用戶的時區資訊。
我的前端介面有一個字段,使用者可以輸入一個日期/時間作為某個過程的時間,這個時間會以使用者的時區發送到API。因此,當我保存該記錄時,我會將其轉換為UTC,然後插入到資料庫中,如下所示;
auth()->user()->procedure()->create([ 'procedure_time' => Carbon::parse($request->procedure_time, auth()->user()->timezone)->setTimezone('UTC'), ]);
我正在嘗試獲取當前用戶時區下當天所有用戶過程的記錄,並將這些結果返回到前端。我以為結果是正確的,但當我的電腦到午夜時,結果仍然顯示為前一天的記錄,持續了大約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();
我無法找出我錯在哪裡。
我使用了whereBetween方法,並使用使用者的時區轉換了一天的開始和結束時間。這樣,資料庫將根據使用者的本地時間進行查詢,您應該能夠得到正確的結果。
在處理應用程式中的時間戳記時,正確處理時區轉換非常重要。為了確保一致性和準確性,請遵循以下準則: