momentjs内部对象什么是" _d" vs" _i"

时间:2015-01-24 14:28:42

标签: momentjs

我正在使用momentjs并使用moment.hour(xx)moment.minute(xx)操作日期。

当我在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

有人能开导我吗?

2 个答案:

答案 0 :(得分:75)

不要理会那些。使用各种输出功能,例如.format()See the Moment.js guidance on this topic

由于Date对象的工作方式,内部时刻有一些怪癖。公共API中的所有功能都将它们考虑在内,但您可能不想自己解决这些问题。

虽然要完整,但我会详细说明他们的目的:

  • _i是创建moment对象时使用的输入。它可以是字符串,数字,数组或Date对象。

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

    在使用_i创建当前时刻的情况下,

    moment()也可能未定义。

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

    如果您处于"本地模式",则_d将具有与对象展示公共API时相同的本地日期和时间。 getTimevalueOf返回的时间戳也将匹配。

    如果您处于" UTC模式",那么_d仍将具有与当前对象展示公共API时相同的 UTC 日期和时间。这可能会造成混淆,因为您需要查看getUTCDate上的_d和其他基于UTC的函数才能看到它们匹配。这里的时间戳仍然匹配。

    如果您使用utcOffsetzonetz功能更改了时区偏移,则_d无法忍受单独。它还必须考虑是否定义了_offset。如果是,则必须首先根据偏移量调整支持_d对象的时间戳。您可以在valueOf方法here的实施中看到此行为。

这是当前版本的这两个字段的行为(2.10.6,因为我写这篇文章)。但是,还有其他字段,由于这些是内部字段,因此在将来的版本中行为可能会发生变化。请特别注意issue #2616

答案 1 :(得分:3)

作为@Matt答案的补充:

从Chrome控制台查看此结果:

date1是片刻的有效对象:

如您所见,._ d和._i具有不同的值。因此,您最好在源代码中使用format()函数(如@Matt Johnson所写)。