Objeto interno Moment.js ¿qué es "_d" frente a "_i"?

Resuelto Piotr Stulinski asked hace 9 años • 2 respuestas

Estoy usando Moment.js y manipulando una fecha usando moment.hour(xx) moment.minute(xx).

Cuando en console.logel momento veo que el objeto contiene un _dy _i: ¿ _dcontiene el cambio correcto moment.hour()o moment.minute()cambia sin embargo el _iobjeto 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?

Piotr Stulinski avatar Jan 24 '15 21:01 Piotr Stulinski
Aceptado

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 Datefunciona 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:

  • _ies la entrada utilizada al crear el momentobjeto. Puede ser una cadena, un número, una matriz o un Dateobjeto.

    Sin embargo, si momentse pasa otro objeto, se _icopiará en ese momento _iy también se copiarán otras propiedades. _iNunca será un momentobjeto.

    _iTambién puede ser indefinido, en el caso de crear el momento actual con moment().

  • _des la instancia del Dateobjeto que respalda el momentobjeto.

    Si está en "modo local", _dtendrá la misma fecha y hora locales que el objeto de momento se muestra con la API pública. Las marcas de tiempo devueltas por getTimeo valueOftambién coincidirán.

    Si está en "modo UTC", seguirá _dteniendo 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 mirar getUTCDatey otras funciones basadas en UTC _dpara 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, zoneo tz, entonces el _dvalor no puede ser independiente . También se debe considerar si _offsetestá definido. Si es así, entonces la marca de tiempo que respalda el _dobjeto debe ajustarse primero por la cantidad del desplazamiento. Puede ver este comportamiento en la implementación del valueOfmétodo aquí .

    Además, si observa la salida de la cadena de _dcuando se aplicó un desplazamiento o zona horaria diferente, aparecerá que está _dusando la zona horaria local . Sin embargo, esa conversión a la hora local es simplemente un efecto secundario de la toStringfunción del Dateobjeto. 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 .

Matt Johnson-Pint avatar Jan 25 '2015 01:01 Matt Johnson-Pint

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.

RolandoCC avatar Jun 24 '2015 17:06 RolandoCC