momentjs内部对象什么是“_d”vs“_i”

我正在使用momentjs和使用moment.hour(xx)moment.minute(xx)操纵date。

当我console.log的时刻,我看到对象包含一个_d和_i:_d包含正确更改的moment.hour()或moment.minute()更改,但_i对象包含原始?

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 

谁能开导我吗?

不要理会这些。 使用各种输出函数,例如.format()来代替。

由于Date对象的工作原因,内部时间有一些怪癖。 公共API中的所有function都将它们考虑在内,但是您可能不想自己弄清楚它们。

只是为了完成,我会详细说明他们的目的:

  • _i是创buildmoment对象时使用的input 。 它可以是一个string,一个数字,一个数组或一个Date对象。

    但是,如果另一个moment对象被传入,则_i将被复制到那个时刻_i ,而其他属性也将被复制。 _i永远不会是一个moment对象。

    在使用moment()创build当前时刻的情况下, _i也可以是未定义的。

  • _d是支持moment对象的Date对象的实例。

    如果您处于“本地模式”,那么_d将具有与公共API一样的时刻对象具有相同的本地date和时间。 getTimevalueOf返回的时间戳也将匹配。

    如果您处于“UTC模式”,那么_d仍将具有与公共API一样的时间对象的UTCdate和时间。 这可能会令人困惑,因为您需要查看_d上的getUTCDate和其他基于UTC的函数才能看到它们匹配。 时间戳也将在这里匹配。

    如果使用utcOffsetzonetz函数更改了时区偏移量,则_d不能单独存在 。 它还必须考虑是否定义_offset 。 如果是,则支持_d对象的时间戳必须先由偏移量进行调整。 你可以在这里实现valueOf方法中看到这个行为。

这就是当前版本的这两个字段的行为(我写这个时是2.10.6)。 然而,还有其他领域,因为这些是内部领域,所以完全有可能在未来的版本中改变行为。 特别是见#2616 。

作为@ Matt的回答的补充:

从chrome的控制台检出这个结果:

date1是片刻的有效对象:

正如你所看到的,._d和._i有不同的值。 所以你最好在源代码中使用format()函数(如@Matt Johnson写的)。