web-dev-qa-db-fra.com

moment.js - UTC donne une date erronée

Pourquoi moment.js UTC indique-t-il toujours la mauvaise date? Par exemple, à partir de la console de 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 retourneront "2013-07-17" pourquoi renvoie-t-il 17ème au lieu de 18ème, qui a été transmis.

Mais si j'utilise momentjs sans l'utc:

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

Je reviens "2013-07-18" et c'est ce à quoi je m'attends également lorsque j'utilise moment.js UTC.

Est-ce que cela signifie que nous ne pouvons pas obtenir la date correcte lorsque nous utilisons moment.js UTC?

75
brg

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 puis le convertissez dans le fuseau horaire UTC (en fait, l’instance du moment passe à mode UTC ). Ainsi, lorsqu’elle est formatée, elle est décalée (en fonction sur votre heure locale) en avant ou en 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 UTC + 3 pendant l'heure d'été):

>>> 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 probablement le devrait) l’analyser comme une date UTC à la première place en utilisant moment.utc() = et incluez la chaîne de format comme second 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 inverser la tendance et convertir une date UTC en une date locale, vous pouvez utiliser la méthode local() , comme suit:

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

Date et moment analyseront la chaîne d'entrée dans le fuseau horaire local du navigateur par défaut. Cependant, Date est parfois incompatible avec cet aspect. Si la chaîne est spécifiquement YYYY-MM-DD, en utilisant des tirets , ou s’il s’agit de 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 est analysé.

La manière correcte d’analyser un moment d’entrée au format UTC dans le format que vous avez fourni serait la suivante:

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

Reportez-vous à cette documentation .

Si vous souhaitez ensuite formater différemment la sortie, procédez comme suit:

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

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

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é soit le 4 janvier, soit le 1er avril, selon les paramètres de culture du navigateur.

27
Matt Johnson-Pint