將Laravel結果傳回給使用者時,時區顯示不正確。
P粉536909186
2023-07-27 11:05:57
<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>
我使用了whereBetween方法,並使用使用者的時區轉換了一天的開始和結束時間。這樣,資料庫將根據使用者的本地時間進行查詢,您應該能夠得到正確的結果。
在處理應用程式中的時間戳記時,正確處理時區轉換非常重要。為了確保一致性和準確性,請遵循以下準則: