-2
votes

Comment convertir une chaîne de dateTime UTC en fuseau horaire actuel des utilisateurs?

J'utilise Laravel 5.7 pour API et VUE pour l'avant. Dans la réponse de l'API, je reçois le dernier horodatage d'un utilisateur comme last_seen: "2019-04-17 05:20:37" code> qui est par défaut au format UTC.

code API de Laravel : strong> p> xxx pré>

cette réponse de l'API que je reçois: strong> Entrez la description de l'image ici p>

sur l'extrémité avant, c'est-à-dire en Vue j'utilise Paquet Dayjs pour afficher la dernière fois que l'utilisateur vu comme [jour | heures | minutes de l'utilisateur] il y a code> mais le problème est Utilisateur prévu est connecté juste maintenant strong> mais je Je reçois, c'est montrer 6 heures il y a 6 heures code> p>

Depuis que je suis dans Asie / Kolkata ​​em> Timezone, le code prend 5,5 / 6 heures également en considération.

J'ai aussi essayé avec Moment.js code> mais je reçois Moment de fonction non défini.tz.guess () code> Erreur p>

C'est ce que j'ai essayé jusqu'à présent: strong> p>

Je passe la chaîne DateTime à ma fonction de Vuejs: p> xxx pré>

puis appelez ceci Méthode d'imprimer comme il y a 1 minute code>. p>

<div class="side-box mt-4">
                  <h2 class="side-head">
                    <i class="fa fa-clock-o" />
                    {{ convertFromNow(userInfo.user_details.last_seen) }}
                    <h6 class="text-gray">
                      Last seen
                    </h6>
                  </h2>
                </div>


10 commentaires

Quel est le problème dans l'utilisation d'un moment.js? C'est une grande bibliothèque.


@iwaDuarte Il n'y a pas de problème à utiliser instant.js mais j'arrête à deviner le fuseau horaire de l'utilisateur.


Reportez-vous également à ce lien pour comprendre ce qui se passe avec votre code. Github.com/moment/moment-timeZone/issues/523 . Pourriez-vous également modifier votre question pour inclure le code que vous utilisez avec moment.js?


Pourquoi votre API renvoie-t-elle la date / heure de la date / l'heure sans informations de fuseau horaire? IMHO, le meilleur format de transport pour les dates est ISO 8601, c'est-à-dire 2019-04-17T05: 20: 37Z . Cela le rend sans ambiguïté et JS peut l'analyser correctement. Dans mon navigateur, l'analyse de votre "2019-04-17 05:20:37" String le traite comme une heure locale (ce qui semble être votre problème)


Vous pouvez obtenir l'heure actuelle de l'utilisateur à l'aide de tolocalestring ()


De Documentation Dayjs : "Si vous souhaitez analyser ou afficher en UTC, vous pouvez utiliser .utc .Local .iSutc avec plugin uc"


La vraie question concerne comment votre horodatage stocké et quel code PHP utilisez-vous pour les définir dans la réponse de l'API? Réparer cela pour utiliser le format ISO 8601 et tous vos problèmes vont probablement disparaître


@Phil Par défaut, Laravel stocke des horodatages dans le format UTC.


1) Cela ne répond pas à ma question du tout, et 2) 2019-04-17 05:20:37 est pas A . Comment allez-vous la réponse de l'API? Qu'est-ce que exactement est le format de données stocké? Si c'est dans un DB, quel type de données est la colonne?


@Phil j'ai ajouté le code API LARAVEL et a mis à jour le code.


4 Réponses :


1
votes

Ma compréhension de votre question est que vous devez obtenir le fuseau horaire de l'utilisateur (à travers leur navigateur). Je démontrerai cela à l'aide de CDN du moment.

Vous devez avoir à la fois instant.js code> et moment-tempone-with-data.js code>: p>

Carbon::parse($time)->setTimezone($tz);


0 commentaires

2
votes

Vous essayez également d'utiliser instant.js code>, vous devez indiquer code> le moment code> est dans uc

p>

<script src="https://momentjs.com/downloads/moment.js"></script>


2 commentaires

Cette réponse fonctionne autour du problème. Vous devriez viser à le réparer à la source


@Phil Oui, cela a fonctionné et j'ai mis en œuvre cela selon le VUE. Moment d'importation de "moment"; ConvertfromNow (date) { retour de retour.utc (date) .Fromnow (); `},`



1
votes

Voici ma solution à Vanilla JavaScript (sans dépendre des bibliothèques externes telles que moments.js ou jours.js).

L'astuce consiste à ajouter 'UTC' à votre chaîne de date, avant de la convertir en javascript date objet. P>

p>

const dateString = '2019-04-17 05:20:37';
const localDate = new Date(`${dateString} UTC`);
console.log(localDate)


4 commentaires

"Si vous exécutez le code ci-dessus sur votre console de navigateur local (Chrome), il doit imprimer l'heure en fonction de votre fuseau horaire local (ou de votre utilisateur)." - et Firefox imprimera null


Merci @wentjun Votre solution m'a aidé :) Mais laissez-moi tester aussi d'autres navigateurs.


@Andreas pourriez-vous s'il vous plaît laissez-moi savoir votre version Firefox? Je crois que cela ne s'applique qu'aux navigateurs de Firefox 'plus âgés'


@DineshsThark Je dois ajouter une responsabilité de non-responsabilité, cette méthode peut ne pas fonctionner sur les plus anciens de navigateurs.



1
votes

Votre chaîne de date / heure "2019-04-17 05:20:37" EM> peut représenter une heure UTC mais JavaScript l'analysera comme une heure locale, ce qui signifie que les temps seront toujours strong> se tromper.

La réponse très simple consiste à utiliser un format sans ambiguïté, comme ISO 8601 / ATOM, par exemple P>

$user_details = [
    // snip
    'account_creation_date' => $userDetails->created_at->toAtomString(),
    'last_seen' => $lastSeen != null ? $lastSeen->toAtomString() : $userDetails->last_login->toAtomString(),
    // snip
];


1 commentaires

Merci @Phil pour avoir souligné cette amélioration. En fait, je ne savais pas à propos de ce toatomstring () méthode de carbone.