¿Por qué moment.js UTC siempre muestra la fecha incorrecta? Por ejemplo, desde la consola de desarrollo de Chrome:
moment(('07-18-2013')).utc().format("YYYY-MM-DD").toString()
// or
moment.utc(new Date('07-18-2013')).format("YYYY-MM-DD").toString()
Ambos regresarán "2013-07-17" por qué regresa el 17 en lugar del 18 , que se pasó.
Pero si uso momentjs sin utc:
moment(new Date('07-18-2013')).format("YYYY-MM-DD").toString()
Vuelvo "2013-07-18", que es lo que también espero cuando uso moment.js UTC.
¿Significa esto que no podemos obtener la fecha correcta cuando usamos moment.js UTC?
toString()
despuésformat()
(ya devuelve una cadena).Respuestas:
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):
Si desea que la cadena de fecha y hora se interprete como UTC, debe ser explícito al respecto:
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.Para ir al revés y convertir una fecha UTC en una fecha local, puede usar el
local()
método de la siguiente manera:fuente
new Date('07-18-2013 UTC')
no funcionará en IE8, si le importa.Ambos
Date
ymoment
analizarán la cadena de entrada en la zona horaria local del navegador de forma predeterminada. Sin embargo, aDate
veces es incompatible con este aspecto. Si la cadena es específicamenteYYYY-MM-DD
, usando guiones , o si lo esYYYY-MM-DD HH:mm:ss
, la interpretará como hora local . A diferenciaDate
,moment
siempre será coherente sobre cómo analiza.La forma correcta de analizar un momento de entrada como UTC en el formato que proporcionó sería así:
Consulte esta documentación .
Si desea luego formatearlo de manera diferente para la salida, debe hacer esto:
No es necesario llamar
toString
explícitamente.Tenga en cuenta que es muy importante proporcionar el formato de entrada. Sin él, una fecha como
01-04-2013
podría procesarse como 4 de enero o 1 de abril, según la configuración cultural del navegador.fuente
moment
en la consola no es muy útil. Probablemente esté mirando una de sus propiedades internas. Debe formatearlo antes de verificar los resultados. Por ejemplomoment.utc().format()
omoment().format()
.new Date('2010-12-12')
me daDate {Sat Dec 11 2010 19:00:00 GMT-0500 (Eastern Daylight Time)}
en FF 38.0.5. Solo para contextualizar lo que significa exactamente "en la hora local"; en este caso, parece significar "Date
asumirá que una cadena sin zona horaria está en UTC y se analizará en la hora local".d.getUTCDate()
=12
yd.getDate()
=11
'2012-12-12'
es UTC b / c, está en formato ISO, pero'December 12, 2012'
e incluso'2012/12/12'
se analizan con una zona horaria local en ES5), pero me has adelantado. Tan genial que ES6 los hace a todos locales [dijo sarcásticamente]. Las fechas son un dolor, (c) Adviento de las fechas