Objeto interno Moment.js ¿qué es "_d" frente a "_i"?
Estoy usando Moment.js y manipulando una fecha usando moment.hour(xx)
moment.minute(xx)
.
Cuando en console.log
el momento veo que el objeto contiene un _d
y _i
: ¿ _d
contiene el cambio correcto moment.hour()
o moment.minute()
cambia sin embargo el _i
objeto contiene el original?
k {_isAMomentObject: true, _i: Thu Dec 11 2014 20:34:00 GMT+0200 (South Africa Standard Time), _isUTC: false, _pf: Object, _locale: j…}
_d: Thu Dec 11 2014 14:00:00 GMT+0200
_i: Thu Dec 11 2014 20:34:00 GMT+0200
¿Alguien podría iluminarme?
No les prestes atención. Utilice las distintas funciones de salida, como .format()
en su lugar. Consulte la guía de Moment.js sobre este tema . En resumen, todos los campos que tienen el prefijo un guión bajo ( _
) deben considerarse fuera de los límites.
Los aspectos internos del momento tienen algunas peculiaridades debido a cómo Date
funciona el objeto. Todas las funciones de la API pública las tienen en cuenta, pero probablemente no quieras descubrirlas tú mismo.
Sin embargo, para estar completo, explicaré su propósito:
_i
es la entrada utilizada al crear elmoment
objeto. Puede ser una cadena, un número, una matriz o unDate
objeto.Sin embargo, si
moment
se pasa otro objeto, se_i
copiará en ese momento_i
y también se copiarán otras propiedades._i
Nunca será unmoment
objeto._i
También puede ser indefinido, en el caso de crear el momento actual conmoment()
._d
es la instancia delDate
objeto que respalda elmoment
objeto.Si está en "modo local",
_d
tendrá la misma fecha y hora locales que el objeto de momento se muestra con la API pública. Las marcas de tiempo devueltas porgetTime
ovalueOf
también coincidirán.Si está en "modo UTC", seguirá
_d
teniendo la misma fecha y hora UTC que el objeto de momento que se muestra con la API pública. Esto puede resultar confuso, ya que necesitaría mirargetUTCDate
y otras funciones basadas en UTC_d
para poder verlas coincidir. Las marcas de tiempo seguirán coincidiendo aquí también.Si ha cambiado el desplazamiento de la zona horaria con las funciones
utcOffset
,zone
otz
, entonces el_d
valor no puede ser independiente . También se debe considerar si_offset
está definido. Si es así, entonces la marca de tiempo que respalda el_d
objeto debe ajustarse primero por la cantidad del desplazamiento. Puede ver este comportamiento en la implementación delvalueOf
método aquí .Además, si observa la salida de la cadena de
_d
cuando se aplicó un desplazamiento o zona horaria diferente, aparecerá que está_d
usando la zona horaria local . Sin embargo, esa conversión a la hora local es simplemente un efecto secundario de latoString
función delDate
objeto. Moment no utiliza ese resultado en sus funciones.
Este es el comportamiento de estos dos campos a partir de la versión actual (2.10.6 mientras escribo esto). Sin embargo, también hay otros campos y, dado que son campos internos , es muy posible que el comportamiento cambie en una versión futura. En particular, consulte el número 2616 .
Como complemento a la respuesta de @Matt:
Consulte este resultado desde la consola de Chrome:
date1 es un objeto válido de momento:
Como puede ver, ._d y ._i tienen valores diferentes. Así que será mejor que utilices la función format() (como escribió @Matt Johnson) dentro de tu código fuente.