Lors du renvoi des résultats Laravel à l'utilisateur, le fuseau horaire ne s'affiche pas correctement.
P粉536909186
P粉536909186 2023-07-27 11:05:57
0
1
602
<p>J'ai une API Laravel et le fuseau horaire de l'application est défini sur UTC. Le fuseau horaire de MySQL est défini sur SYSTEM, qui est également exprimé en UTC. J'ai également une colonne dans la table des utilisateurs qui stocke les informations de fuseau horaire de l'utilisateur. <br /><br />Mon interface frontale a un champ dans lequel l'utilisateur peut saisir une date/heure comme heure d'un certain processus, et cette heure sera envoyée à l'API au moment de l'utilisateur. zone. Ainsi, lorsque cet enregistrement est enregistré, je le convertis en UTC, puis je l'insère dans la base de données comme ceci </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'), ]); ≪/pré> <p>J'essaie d'obtenir des enregistrements de tous les processus utilisateur pour la journée en cours dans le fuseau horaire de l'utilisateur actuel et de renvoyer ces résultats au frontend. Je pensais que les résultats étaient corrects, mais lorsque mon ordinateur est arrivé à minuit, les résultats étaient toujours affichés comme les enregistrements de la veille pendant environ 10 heures. C'est ainsi que j'essaie de renvoyer ces résultats ;</p> <pre class="brush:php;toolbar:false;">$todayProcedures = Procedure::query() ->où('id_utilisateur', $user->id) ->whereDate('procedure_time', '>=', Carbon::now()->startOfDay()->tz($user->timezone)) ->whereDate('procedure_time', '<=', Carbon::now()->endOfDay()->tz($user->timezone)) ->obtenir(); ≪/pré> <p>Je n'arrive pas à comprendre où je me suis trompé. </p>
P粉536909186
P粉536909186

répondre à tous(1)
P粉006977956

J'ai utilisé la méthode WhereBetween et converti le début et la fin de la journée en utilisant le fuseau horaire de l'utilisateur. De cette façon, la base de données sera interrogée en fonction de l'heure locale de l'utilisateur et vous devriez pouvoir obtenir les résultats corrects.

$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();

Lorsque vous traitez les horodatages dans votre application, il est important de gérer correctement les conversions de fuseau horaire. Pour garantir la cohérence et l'exactitude, veuillez suivre ces directives :

  1. Stockage de la base de données : stockez toujours les horodatages dans la base de données au format UTC. Cela garantit que tous les horodatages sont standardisés, indépendamment de tout fuseau horaire spécifique.
  2. Conversion du fuseau horaire de requête : la conversion du fuseau horaire est effectuée lors de l'interrogation de la base de données, et non lorsque les enregistrements sont insérés ou mis à jour. En faisant cela, vous vous assurez que les données extraites de la base de données sont cohérentes et exactes quel que soit le fuseau horaire de l'utilisateur.
  3. Affichage basé sur le fuseau horaire de l'utilisateur : effectuez les conversions nécessaires lors de l'affichage des horodatages aux utilisateurs ou du traitement en fonction de leurs préférences de fuseau horaire. En ajustant l'horodatage au fuseau horaire de l'utilisateur, vous pouvez offrir une expérience plus conviviale et localisée.
Suivez ces directives et votre application conservera des données d'horodatage précises et fournira des résultats cohérents sur différents fuseaux horaires.


Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal