Apabila mengembalikan hasil Laravel kepada pengguna, zon waktu dipaparkan secara tidak betul.
P粉536909186
2023-07-27 11:05:57
<p>Saya mempunyai API Laravel dan zon waktu aplikasi ditetapkan kepada UTC. Zon waktu MySQL ditetapkan kepada SYSTEM, yang juga dinyatakan sebagai UTC. Saya juga mempunyai lajur dalam jadual pengguna yang menyimpan maklumat zon waktu pengguna. <br /><br />Antara muka hadapan saya mempunyai medan di mana pengguna boleh memasukkan tarikh/masa sebagai masa proses tertentu dan masa ini akan dihantar ke API dalam masa pengguna Kawasan. Jadi apabila rekod itu disimpan, saya menukarnya kepada UTC dan kemudian memasukkannya ke dalam pangkalan data seperti ini </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'),
]);
</pra>
<p>Saya cuba mendapatkan rekod semua proses pengguna untuk hari semasa dalam zon waktu pengguna semasa dan mengembalikan hasil tersebut ke bahagian hadapan. Saya fikir keputusan itu betul, tetapi apabila komputer saya sampai ke tengah malam, keputusan masih ditunjukkan sebagai rekod hari sebelumnya selama kira-kira 10 jam atau lebih. Beginilah cara saya cuba mengembalikan hasil ini;</p>
<pre class="brush:php;toolbar:false;">$todayProcedures = Prosedur::query()
->di mana('user_id', $user->id)
->whereDate('procedure_time', '>=', Carbon::now()->startOfDay()->tz($user->timezone))
->whereDate('procedure_time', '<=', Carbon::now()->endOfDay()->tz($user->timezone))
->dapatkan();
</pra>
<p>Saya tidak dapat mengetahui di mana silap saya. </p>
Saya menggunakan kaedah whereBetween dan menukar permulaan dan penghujung hari menggunakan zon waktu pengguna. Dengan cara ini pangkalan data akan disoal berdasarkan waktu tempatan pengguna dan anda sepatutnya boleh mendapatkan hasil yang betul.
Apabila berurusan dengan cap masa dalam aplikasi anda, adalah penting untuk mengendalikan penukaran zon waktu dengan betul. Untuk memastikan ketekalan dan ketepatan, sila ikut garis panduan ini: