J'utilise Moment.js pour analyser et mettre en forme les dates dans mon application Web. Dans le cadre d'un objet JSON, mon serveur backend envoie des dates en nombre de millisecondes à partir de l'époque UTC (décalage Unix).
L'analyse des dates dans un fuseau horaire spécifique est facile - il suffit d'ajouter l'identificateur de fuseau horaire RFC 822 à la fin de la chaîne avant l'analyse:
// response varies according to your timezone
const m1 = moment('3/11/2012 13:00').utc().format("MM/DD HH:mm")
// problem solved, always "03/11 17:00"
const m2 = moment('3/11/2012 13:00 -0400').utc().format("MM/DD HH:mm")
console.log({ m1, m2 })
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>
Mais comment formater une date dans un fuseau horaire spécifique ?
Je veux des résultats cohérents quelle que soit l'heure actuelle du navigateur, mais je ne veux pas afficher les dates en UTC.
javascript
timezone
momentjs
menthe tranquille
la source
la source
DD MMM, YYYY
ne fonctionne pas, quand je l'utilise commemoment.tz("2018-02-15T14:20:00.000+0530", "Asia/Bangkok").format("DD MMM, YYYY")
. Quelqu'un peut-il me diriger dans la documentation où je peux trouver toutes les clés pour le formatage du temps lors de l'utilisation de cette api."15 Feb, 2018"
. Vouliez-vous utiliser la chaîne de formatDD MMMM, YYYY
pour obtenir"15 February, 2018"
?Réponses:
Comme indiqué dans la réponse de Manto ,
.utcOffset()
est la méthode préférée à partir de Moment 2.9.0. Cette fonction utilise le décalage réel par rapport à UTC, et non le décalage inverse (par exemple -240 pour New York pendant l'heure d'été). Les chaînes de décalage comme "+0400" fonctionnent de la même manière que précédemment:L'ancien en
.zone()
tant que setter était obsolète dans Moment.js 2.9.0. Il acceptait une chaîne contenant un identifiant de fuseau horaire (par exemple, "-0400" ou "-04: 00" pendant -4 heures) ou un nombre représentant des minutes de retard sur UTC (par exemple, 240 pour New York pendant l'heure d'été).Pour travailler avec des fuseaux horaires nommés au lieu de décalages numériques, incluez Moment Timezone et utilisez à la
.tz()
place:la source
.zone()
comme un getter, qui renvoie les minutes de UTC (par exemple, renvoie 300 pour New York pendant l'heure standard)..tz("America/Phoenix")
si vous incluez momentjs.com/timezone . J'ai mis à jour la réponse avec un exemple.Utiliser le fuseau horaire du moment
Avant de pouvoir accéder à un fuseau horaire particulier, vous devrez le charger comme tel (ou en utilisant des méthodes alternatives décrites ici )
la source
Quelques réponses mentionnent déjà que le fuseau horaire du moment est la voie à suivre avec le fuseau horaire nommé. Je veux juste clarifier quelque chose à propos de cette bibliothèque qui était assez déroutant pour moi. Il y a une différence entre ces deux déclarations:
En supposant qu'un fuseau horaire n'est pas spécifié dans la date passée:
Le premier code prend la date et suppose que le fuseau horaire est celui qui est passé. Le second prendra la date, prendra le fuseau horaire du navigateur, puis changera l'heure et le fuseau horaire en fonction du fuseau horaire transmis.
Exemple:
Mon fuseau horaire est +5 depuis utc. Donc, dans le premier cas, cela ne change pas et il définit la date et l'heure pour avoir le fuseau horaire utc.
Dans le second cas, il suppose que la date passée est en -5, puis le transforme en UTC, et c'est pourquoi il crache la date "2018-07-18T00: 00: 00Z"
REMARQUE: le paramètre de format est vraiment important. En cas d'omission, le moment peut revenir à la classe Date, ce qui peut entraîner des comportements imprévisibles
En supposant que le fuseau horaire est spécifié dans la date passée:
Dans ce cas, ils se comportent tous les deux de la même manière
Même si maintenant je comprends pourquoi cela fonctionne de cette façon, je pensais que c'était une fonctionnalité assez déroutante et méritait d'être expliquée.
la source
.zone () est obsolète et vous devriez utiliser utcOffset à la place:
la source
J'avais le même problème avec Moment.js. J'ai installé moment-timezone, mais le problème n'a pas été résolu. Ensuite, j'ai fait exactement ce qui est exposé ici, définir le fuseau horaire et cela fonctionne comme un charme:
Merci beaucoup!
la source
new Date()
constructeur. Moment fournit tout ce dont vous avez besoin pour analyser les dates. Voir Analyse des documents.new Date()
interne), mais cela n'est pas cohérent entre les navigateurs . Au lieu de cela, vous devez utiliser fournir le format attendu comme deuxième argument. Exemple:moment("12-25-1995", "MM-DD-YYYY")
.Je viens de comprendre cela, et comme j'ai eu le même problème, je posterais simplement les résultats que j'avais obtenus
lors de l'analyse, vous pouvez mettre à jour l'offset (c'est-à-dire que j'analyse une donnée (1.1.2014) et je veux seulement la date, 1er janvier 2014. Sur GMT + 1, j'obtiendrais 31.12.2013.
Eh bien, cela m'a été utile pour prendre en charge tous les fuseaux horaires
B
la source
Vous pouvez essayer ceci,
Ici, vous pouvez obtenir la date en fonction du fuseau horaire du client (navigateur).
Le regex vous donne essentiellement la valeur de décalage.
À votre santé!!
la source