Question moment.js - UTC donne une date erronée


Pourquoi moment.js UTC affiche toujours la mauvaise date. Par exemple, depuis la console 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 revient-il 17ème au lieu de 18ème, qui a été passé

Mais si j'utilise momentjs sans l'utc:

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

Je reviens "2013-07-18" c'est ce que j'attends aussi avec l'utilisation de moment.js UTC.

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


59
2017-07-25 10:44


origine


Réponses:


Par défaut, MomentJS analyse l'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 vous la convertissez en fuseau horaire UTC (en fait, il fait basculer l'instance de moment sur Mode UTC), alors quand il est formaté, il est décalé (en fonction de 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 obtenez 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 devrait) analyser comme une 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 inverser la tendance et convertir une date UTC à une date locale, vous pouvez utiliser le local() méthode, comme suit:

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

94
2017-07-25 11:29



Tous les deux Date et moment analysera par défaut la chaîne d’entrée dans le fuseau horaire local du navigateur. toutefois Date est parfois incompatible avec 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 va l'interpréter comme heure locale. contrairement à Date, moment sera toujours cohérent sur la façon dont il analyse.

La manière correcte d’analyser un moment de saisie comme UTC au format que vous avez fourni serait comme suit:

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

Faire référence à cette documentation.

Si vous souhaitez ensuite le formater différemment pour 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 toString explicitement.

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


24
2017-07-25 13:24