De forma predeterminada, MomentJS analiza en la hora local. Si solo se proporciona una cadena de fecha (sin hora), la hora predeterminada es medianoche.
En su código, crea una fecha local y luego la convierte a la zona horaria UTC (de hecho, hace que la instancia de momento cambie al modo UTC ), por lo que cuando se formatea, se desplaza (según su hora local) hacia adelante o hacia adelante hacia atrás.
Si la zona horaria local es UTC + N (N es un número positivo) y analiza una cadena de solo fecha, obtendrá la fecha anterior.
Aquí hay algunos ejemplos para ilustrarlo (mi compensación de hora local es UTC + 3 durante 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 desea que la cadena de fecha y hora se interprete como UTC, debe ser explícito al respecto:
>>> moment(new Date('07-18-2013 UTC')).utc().format("YYYY-MM-DD HH:mm")
"2013-07-18 00:00"
o, como Matt Johnson menciona en su respuesta, puede ( y probablemente debería ) analizarlo como una fecha UTC en primer lugar utilizando moment.utc()
e incluir la cadena de formato como un segundo argumento para evitar ambigüedad.
>>> moment.utc('07-18-2013', 'MM-DD-YYYY').format("YYYY-MM-DD HH:mm")
"2013-07-18 00:00"
Para ir al revés y convertir una fecha UTC en una fecha local, puede usar el local()
método de la siguiente manera:
>>> moment.utc('07-18-2013', 'MM-DD-YYYY').local().format("YYYY-MM-DD HH:mm")
"2013-07-18 03:00"
toString()
despuésformat()
(ya devuelve una cadena).