122 votes

moment.js - UTC donne une date erronée

Pourquoi moment.js UTC affiche-t-il toujours la mauvaise date. Par exemple, dans la console du développeur de chrome :

moment(('07-18-2013')).utc().format("YYYY-MM-DD").toString()
// or
moment.utc(new Date('07-18-2013')).format("YYYY-MM-DD").toString()

Les deux reviendront "2013-07-17" pourquoi il revient 17ème au lieu de 18ème qui a été adoptée.

Mais si j'utilise momentjs sans l'utc :

moment(new Date('07-18-2013')).format("YYYY-MM-DD").toString()

Je reviens "2013-07-18" ce qui est aussi ce que j'attends en utilisant moment.js UTC.

Cela signifie-t-il que nous ne pouvons pas obtenir la date correcte en utilisant moment.js UTC ?

207voto

MasterAM Points 2574

Par défaut, MomentJS analyse en heure locale. Si seule une chaîne de date (sans heure) est fournie, l'heure par défaut est minuit.

Dans votre code, vous créez une date locale et la convertissez ensuite dans le fuseau horaire UTC (en fait, l'instance du moment bascule en Mode UTC ), de sorte que lorsqu'il est formaté, il est décalé (en fonction de votre heure locale) vers l'avant ou l'arrière.

Si le fuseau horaire local est UTC+N (N étant un nombre positif), et que vous analysez une chaîne de date uniquement, vous obtiendrez la date précédente.

Voici quelques exemples pour l'illustrer (mon décalage horaire local est de UTC+3 pendant le DST) :

>>> moment('07-18-2013', 'MM-DD-YYYY').utc().format("YYYY-MM-DD HH:mm")
"2013-07-17 21:00"
>>> moment('07-18-2013 12:00', 'MM-DD-YYYY HH:mm').utc().format("YYYY-MM-DD HH:mm")
"2013-07-18 09:00"
>>> Date()
"Thu Jul 25 2013 14:28:45 GMT+0300 (Jerusalem Daylight Time)"

Si vous voulez que la chaîne date-heure soit interprétée comme UTC, vous devez être explicite à ce sujet :

>>> moment(new Date('07-18-2013 UTC')).utc().format("YYYY-MM-DD HH:mm")
"2013-07-18 00:00"

ou, comme Matt Johnson le mentionne dans sa réponse, vous pouvez ( et devrait probablement ) l'analyser en tant que date UTC en premier lieu en utilisant moment.utc() et inclure la chaîne de format comme deuxième argument pour éviter toute ambiguïté.

>>> moment.utc('07-18-2013', 'MM-DD-YYYY').format("YYYY-MM-DD HH:mm")
"2013-07-18 00:00"

Pour aller dans l'autre sens et convertir une date UTC en une date locale, vous pouvez utiliser la fonction local() comme suit :

>>> moment.utc('07-18-2013', 'MM-DD-YYYY').local().format("YYYY-MM-DD HH:mm")
"2013-07-18 03:00"

41voto

Matt Johnson Points 33433

Les deux sites Date y moment analysera la chaîne d'entrée dans le fuseau horaire local du navigateur par défaut. Toutefois, Date est parfois incohérent à cet égard. Si la chaîne est spécifiquement YYYY-MM-DD en utilisant traits d'union ou si c'est YYYY-MM-DD HH:mm:ss il l'interprétera comme heure locale . Contrairement à Date , moment sera toujours cohérent sur la façon dont il analyse les données.

La façon correcte d'analyser un moment d'entrée comme UTC dans le format que vous avez fourni serait la suivante :

moment.utc('07-18-2013', 'MM-DD-YYYY')

Se référer à cette documentation .

Si vous voulez ensuite le formater différemment pour la sortie, vous devez faire ceci :

moment.utc('07-18-2013', 'MM-DD-YYYY').format('YYYY-MM-DD')

Vous n'avez pas besoin d'appeler toString explicitement.

Notez qu'il est très important de fournir le format d'entrée. Sans cela, une date comme 01-04-2013 peut être traité comme le 4 janvier ou le 1er avril, selon les paramètres culturels du navigateur.

2voto

Mohammad Sbaih Points 21

Utiliser ce :

return moment.utc(new Date(oData.CreatedAtUtc), 'MM/DD/YYYY h:mm A').local().format("YYYY-MM-DD HH:mm") + ' (' + timezoneAbbr + ')';

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