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"