web-dev-qa-db-fra.com

Formater la date dans un fuseau horaire spécifique

J'utilise Moment.js pour analyser et formater les dates dans mon application Web. En tant qu'élément d'un objet JSON, mon serveur backend envoie des dates sous forme de millisecondes à partir de l'époque UTC (décalage Unix).

L'analyse des dates dans un fuseau horaire spécifique est simple: il suffit d'ajouter l'identifiant du fuseau horaire RFC 822 à la fin de la chaîne avant d'analyser:

// response varies according to your timezone
moment('3/11/2012 13:00').utc().format("MM/DD HH:mm")

// problem solved, always "03/11 17:00"
moment('3/11/2012 13:00 -0400').utc().format("MM/DD HH:mm")

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 souhaite pas afficher les dates au format UTC.

149
quietmint

Comme indiqué dans réponse de Manto , .utcOffset() est la méthode recommandée à partir du 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 telles que "+0400" fonctionnent comme avant:

// always "2013-05-23 00:55"
moment(1369266934311).utcOffset(60).format('YYYY-MM-DD HH:mm')
moment(1369266934311).utcOffset('+0100').format('YYYY-MM-DD HH:mm')

L'ancien .zone() en tant que configurateur était obsolète dans Moment.js 2.9.0. Il acceptait une chaîne contenant un identificateur de fuseau horaire (par exemple, "-0400" ou "-04: 00" pendant -4 heures) ou un nombre représentant les minutes derrière UTC (par exemple, 240 pour New York à l’heure d’été).

// always "2013-05-23 00:55"
moment(1369266934311).zone(-60).format('YYYY-MM-DD HH:mm')
moment(1369266934311).zone('+0100').format('YYYY-MM-DD HH:mm')

Pour utiliser des fuseaux horaires nommés plutôt que des décalages numériques, incluez Moment Timezone et utilisez .tz() à la place:

// determines the correct offset for America/Phoenix at the given moment
// always "2013-05-22 16:55"
moment(1369266934311).tz('America/Phoenix').format('YYYY-MM-DD HH:mm')
207
quietmint

Utilisez moment-fuseau horaire

moment(date).tz('Europe/Berlin').format(format)

Avant de pouvoir accéder à un fuseau horaire particulier, vous devez le charger comme suit (ou utiliser les méthodes alternatives décrites ici )

moment.tz.add('Europe/Berlin|CET CEST CEMT|-10 -20 -30')
46
Philip Nuzhnyy

Quelques réponses mentionnent déjà que l'instant-fuseau horaire est la voie à suivre avec le fuseau horaire nommé. Je veux juste clarifier quelque chose au sujet de cette bibliothèque qui était assez déroutant pour moi. Il y a une différence entre ces deux déclarations:

moment.tz(date, format, timezone)

moment(date, format).tz(timezone)

En supposant qu'un fuseau horaire ne soit pas spécifié dans la date passée:

Le premier code prend la date et suppose que le fuseau horaire est celui qui a été transmis. Le second code prend la date, assume le fuseau horaire du navigateur, puis modifie l'heure et le fuseau horaire en fonction du fuseau horaire transmis.

Exemple:

moment.tz('2018-07-17 19:00:00', 'YYYY-MM-DD HH:mm:ss', 'UTC').format() // "2018-07-17T19:00:00Z"

moment('2018-07-17 19:00:00', 'YYYY-MM-DD HH:mm:ss').tz('UTC').format() // "2018-07-18T00:00:00Z"

Mon fuseau horaire est +5 de utc. Donc, dans le premier cas, cela ne change pas et cela fixe la date et l'heure pour avoir le fuseau horaire utc.

Dans le second cas, il suppose que la date indiquée est dans -5, puis le convertit en UTC, et c’est pourquoi il indique la date "2018-07-18T00: 00: 00Z".

NOTE: Le paramètre format est vraiment important. Si omis, le moment pourrait retomber sur 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


Bien que je comprenne maintenant pourquoi cela fonctionne de cette manière, j’ai pensé que c’était une fonctionnalité assez déroutante et qu’elle méritait d’être expliquée.

24
Nicola Pedretti

.zone () est obsolète et vous devriez plutôt utiliser utcOffset:

// for a timezone that is +7 UTC hours
moment(1369266934311).utcOffset(420).format('YYYY-MM-DD HH:mm')
16
Manto

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éfini le fuseau horaire et cela fonctionne comme un charme:

moment(new Date({your_date})).zone("+08:00")

Merci beaucoup!

5
facundofarias

Vient juste d'acreoss ceci, et depuis que j'ai le même problème, je posterais juste les résultats que je suis venu avec

lors de l'analyse, vous pouvez mettre à jour le décalage (c'est-à-dire que je suis en train d'analyser des données (1.1.2014) et que je ne veux que la date, le 1er janvier 2014. À l'heure GMT + 1, j'obtiens le 31.12.2013. Donc, je décale d'abord la valeur.

moment(moment.utc('1.1.2014').format());

Eh bien, est utile pour moi à soutenir à travers les fuseaux horaires

B

3
Bard Rotzer