Moment: Est-il possible de conserver le fuseau horaire du backend ?

Créé le 4 oct. 2018  ·  3Commentaires  ·  Source: moment/moment

Description du problème et étapes à reproduire :
Supposons que j'ai reçu une date du backend dans ce format :

"2018-10-10T13:00:00+11:00"

Ce que je m'attends à voir dans le frontend après l'analyse et le formatage :

10-10-2018 1.00 PM

Ce que j'ai:

10-10-2018 5.00 AM

Peu m'importe le fuseau horaire de mon système. Je ne veux pas non plus voir l'heure UTC. Comment puis-je y parvenir ?

Veuillez inclure les valeurs de toutes les variables utilisées.

Voir au dessus.

Environnement:

Peu importe, cela ne devrait pas dépendre de l'environnement. C'est le problème, d'ailleurs, parce que ça dépend !

Commentaire le plus utile

Vous pouvez essayer parseZone :

par exemple pour un fuseau horaire local en BST (UTC + 1)

moment.parseZone("2018-10-10T13:00:00+11:00").format(); // "2018-10-10T13:00:00+11:00"
moment.parseZone("2018-10-10T13:00:00+11:00").local().format(); // "2018-10-10T03:00:00+01:00"
moment.parseZone("2018-10-10T13:00:00+11:00").utc().format(); // "2018-10-10T02:00:00Z"

Tous les 3 commentaires

Autant que je sache, moment utilise par défaut le fuseau horaire de l'appareil lors du formatage d'une date (ce qui est également le comportement standard de Javascript). Alors oui, le formatage d'une date doit dépendre de l'environnement. Par exemple, sur mon appareil, je reçois ceci pour votre date, qui est l'heure correcte pour mon heure locale (Auckland) :

moment("2018-10-10T13:00:00+11:00").format()
// => '2018-10-10T15:00:00+13:00'

Si vous souhaitez définir manuellement un fuseau horaire par défaut pour l'utilisateur, vous pouvez utiliser moment-timezone avec un nom de fuseau horaire IANA :

moment.tz.setDefault('America/New_York');

Cela imposera tout le formatage à faire pour ce fuseau horaire et sera indépendant de l'environnement.

Voici un lien vers les documents : https://momentjs.com/timezone/docs/#/using -timezones/default-timezone/


Il n'est pas possible de connaître le fuseau horaire de l'utilisateur à partir du décalage (car plusieurs fuseaux horaires peuvent partager le même décalage, par exemple en fonction de l'heure d'été) mais vous pouvez utiliser les noms de zone Etc pour les zones "génériques", par exemple Etc/GMT-11 dans votre cas (le signe est inversé pour ces zones). Dans votre cas, il serait probablement plus logique de stocker le fuseau horaire de l'utilisateur en tant que paramètre et de le conserver sur le serveur, ou de l'enregistrer avec l'horodatage.

Ensuite, vous pouvez imprimer une seule date dans un certain fuseau horaire en utilisant par exemple

moment.tz("2018-10-10T13:00:00+11:00", "America/New_York");

Merci, @simonhaenisch

J'ai vu le plugin tz, mais je pensais que cela aidait à gérer les fuseaux horaires, comme la conversion de l'un à l'autre. Et ça me semble bizarre de l'utiliser juste pour NE PAS toucher du tout au fuseau horaire :)

Si vous souhaitez définir manuellement un fuseau horaire par défaut pour l'utilisateur

Malheureusement, il n'y a pas de fuseau horaire default sur le serveur. Chaque utilisateur a son propre fuseau horaire, enregistré dans le profil. Et le frontend n'en sait rien.

Il n'est pas possible de connaître le fuseau horaire de l'utilisateur à partir du décalage

C'est bon, je me fiche du fuseau horaire. Tout ce dont j'ai besoin, c'est de garder la date à venir sans changement.

stockez le fuseau horaire de l'utilisateur en tant que paramètre et conservez-le sur le serveur, ou enregistrez-le avec l'horodatage.

C'est exactement ce qui se passe. Le fuseau horaire est un paramètre et la date enregistrée avec lui comme horodatage.

Étant donné que l'API backend est sous mon contrôle, je peux simplement envoyer une version réduite de la date, sans décalage de fuseau horaire. J'espère que cela aide.

Mais, c'est vraiment intéressant pourquoi le moment.js n'a pas quelque chose comme ça :

moment(somDateTime).format({ formatWithDeviceTimezone: true })

ou genre :)

formatWithDeviceTimezone est faux par défaut.

Quoi qu'il en soit, merci, maintenant je vois le problème.

Vous pouvez essayer parseZone :

par exemple pour un fuseau horaire local en BST (UTC + 1)

moment.parseZone("2018-10-10T13:00:00+11:00").format(); // "2018-10-10T13:00:00+11:00"
moment.parseZone("2018-10-10T13:00:00+11:00").local().format(); // "2018-10-10T03:00:00+01:00"
moment.parseZone("2018-10-10T13:00:00+11:00").utc().format(); // "2018-10-10T02:00:00Z"
Cette page vous a été utile?
0 / 5 - 0 notes