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和时间。getTime
或valueOf
返回的时间戳也将匹配。如果您处于“UTC模式”,那么
_d
仍将具有与公共API一样的时间对象的UTCdate和时间。 这可能会令人困惑,因为您需要查看_d
上的getUTCDate
和其他基于UTC的函数才能看到它们匹配。 时间戳也将在这里匹配。如果使用
utcOffset
,zone
或tz
函数更改了时区偏移量,则_d
值不能单独存在 。 它还必须考虑是否定义_offset
。 如果是,则支持_d
对象的时间戳必须先由偏移量进行调整。 你可以在这里实现valueOf
方法中看到这个行为。
这就是当前版本的这两个字段的行为(我写这个时是2.10.6)。 然而,还有其他领域,因为这些是内部领域,所以完全有可能在未来的版本中改变行为。 特别是见#2616 。
作为@ Matt的回答的补充:
从chrome的控制台检出这个结果:
date1是片刻的有效对象:
正如你所看到的,._d和._i有不同的值。 所以你最好在源代码中使用format()函数(如@Matt Johnson写的)。