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 la convertissez en fuseau horaire UTC (en fait, cela fait basculer l'instance du moment en mode UTC ), donc lorsqu'elle est formatée, elle est décalée (en fonction de votre heure locale) vers l'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 devriez probablement ) l'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 faire l'inverse et convertir une date UTC en date locale, vous pouvez utiliser la 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"
toString()
aprèsformat()
(il renvoie déjà une chaîne).