Per impostazione predefinita, MomentJS analizza l'ora locale. Se viene fornita solo una stringa di data (senza ora), l'ora predefinita è mezzanotte.
Nel tuo codice, crei una data locale e poi la converti nel fuso orario UTC (infatti, fa passare l'istanza del momento a modalità UTC ), quindi quando viene formattata, viene spostata (a seconda dell'ora locale) in avanti o indietro.
Se il fuso orario locale è UTC + N (N è un numero positivo) e analizzi una stringa di sola data, otterrai la data precedente.
Ecco alcuni esempi per illustrarlo (il mio fuso orario locale è UTC + 3 durante l'ora legale):
>>> 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)"
Se vuoi che la stringa data-ora venga interpretata come UTC, dovresti essere esplicito al riguardo:
>>> moment(new Date('07-18-2013 UTC')).utc().format("YYYY-MM-DD HH:mm")
"2013-07-18 00:00"
oppure, come menziona Matt Johnson nella sua risposta, puoi ( e probabilmente dovresti ) analizzarlo come una data UTC in primo luogo utilizzando moment.utc()
e includere la stringa di formato come secondo argomento per evitare ambiguità.
>>> moment.utc('07-18-2013', 'MM-DD-YYYY').format("YYYY-MM-DD HH:mm")
"2013-07-18 00:00"
Per invertire la rotta e convertire una data UTC in una data locale, puoi utilizzare il local()
metodo, come segue:
>>> moment.utc('07-18-2013', 'MM-DD-YYYY').local().format("YYYY-MM-DD HH:mm")
"2013-07-18 03:00"
toString()
dopoformat()
(restituisce già una stringa).