249 votes

Format date in a specific timezone

Je utilise Moment.js pour analyser et formater des dates dans mon application web. Dans le cadre d'un objet JSON, mon serveur backend envoie des dates en tant que nombre de millisecondes depuis l'époque UTC (décalage Unix).

Parser des dates dans un fuseau horaire spécifique est facile -- il suffit d'ajouter l'identifiant du fuseau horaire RFC 822 à la fin de la chaîne avant de parser :

// la réponse varie en fonction de votre fuseau horaire
const m1 = moment('3/11/2012 13:00').utc().format("MM/DD HH:mm")

// problème résolu, toujours "03/11 17:00"
const m2 = moment('3/11/2012 13:00 -0400').utc().format("MM/DD HH:mm")

console.log({ m1, m2 })

Mais comment formater une date dans un fuseau horaire spécifique ?

Je veux des résultats cohérents indépendamment de l'heure actuelle du navigateur, mais je ne veux pas afficher les dates en UTC.

2 votes

Moment ne prend pas encore en charge cela, mais ils y travaillent. github.com/timrwood/moment/pull/671

6 votes

Ce devrait simplement fonctionner. Si vous transmettez à moment une chaîne temporelle qui inclut le décalage souhaité, alors il devrait conserver ce décalage et afficher l'heure locale telle quelle, plutôt que de s'ajuster automatiquement à l'heure locale du navigateur. Si je voulais qu'il s'ajuste à l'heure locale du navigateur, alors je lui donnerais une heure UTC au lieu de lui donner explicitement un décalage à utiliser. Je veux dire... Je lui donne un décalage explicite, pourquoi le convertit-il à son propre décalage du navigateur. Conception terrible.

0 votes

@Les décalages de Triynko sont soumis à l'heure d'été, donc cela ne fonctionne pas toujours comme prévu.

6voto

Bard Rotzer Points 83

Je viens de tomber sur cela, et comme j'avais le même problème, je vais simplement poster les résultats auxquels je suis parvenu

Lorsque vous analysez, vous pouvez mettre à jour le décalage (c'est-à-dire que je suis en train d'analyser des données (1.1.2014) et je veux juste la date, 1er janvier 2014. Sur GMT+1, j'obtiendrais 31.12.2013. Donc je décale d'abord la valeur.

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

Eh bien, cela m'a été utile pour supporter les différents fuseaux horaires

B

-4voto

Cody Ng Points 73

Si vous passez le timestamp en tant que paramètre à moment() (par exemple si le fuseau horaire est Asia/Hong_kong qui est +08:00), ce que je fais est:

const localDateTime = moment((item.createdAt.seconds + 8 * 3600) * 1000).format('YYYY-MM-DD HH:mm:ss');

1 votes

Il est très dangereux, car les fuseaux horaires nommés comme l'Asie/Hong Kong ne sont PAS identiques à un décalage fixe de 8 * 3600 ! La plupart des fuseaux horaires ont l'heure d'été, donc le décalage change tout au long de l'année.

-13voto

K.Karthik Points 7

Vous pouvez essayer ceci ,

Ici, vous pouvez obtenir la date en fonction du fuseau horaire du client (navigateur).

moment(new Date().getTime()).zone(new Date().toString().match(/([-\+][0-9]+)\s/)[1]).format('YYYY-MM-DD HH:mm:ss')

L'expression régulière vous permet essentiellement d'obtenir la valeur de décalage.

Santé!!

1 votes

Généralement, le moment vous donne tout ce dont vous avez besoin. Vous n'avez jamais besoin de faire correspondre quoi que ce soit de personnalisé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X