Per impostazione predefinita, MomentJS analizza in ora locale. Se viene fornita solo una stringa di data (senza tempo), l'ora predefinita è mezzanotte.
Nel codice, si crea una data locale e quindi la si converte nel fuso orario UTC (infatti, l'istanza dell'istanza del momento passa a UTC mode), quindi quando è formattata, viene spostata (in base all'ora locale)) avanti o indietro.
Se il fuso orario locale è UTC + N (N è un numero positivo) e si analizza una stringa di sola data, si otterrà la data precedente.
Ecco alcuni esempi per illustrare essa (la mia ora locale offset è GMT + 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 si desidera che la stringa data-ora interpretata come UTC, si dovrebbe essere esplicito in proposito:
>>> moment(new Date('07-18-2013 UTC')).utc().format("YYYY-MM-DD HH:mm")
"2013-07-18 00:00"
o, come Matt Johnson cita nella sua risposta, è possibile (e probabilmente dovrebbe) analizzare come una data UTC, in primo luogo con moment.utc()
e includere la stringa di formato come secondo argomento di pre sfogo all'ambiguità.
>>> moment.utc('07-18-2013', 'MM-DD-YYYY').format("YYYY-MM-DD HH:mm")
"2013-07-18 00:00"
Per passare il contrario e convertire una data UTC per una data locale, è possibile utilizzare il metodo local()
, come segue:
>>> moment.utc('07-18-2013', 'MM-DD-YYYY').local().format("YYYY-MM-DD HH:mm")
"2013-07-18 03:00"
Non penso che sia necessario 'toString()' dopo 'format()' (restituisce già una stringa). – alex