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

Pio*_*ski 52 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
Run Code Online (Sandbox Code Playgroud)

谁能开导我?

Mat*_*int 84

不要理会那些.使用各种输出功能,例如.format(). 请参阅有关此主题的Moment.js指南.

由于Date对象的工作原理,内部时刻有一些怪癖.公共API中的所有函数都将它们考虑在内,但您可能不希望自己弄清楚它们.

尽管如此,我会详细说明他们的目的:

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

    但是,如果moment传入另一个对象,_i则会将其复制到该时刻_i,并且还将复制其他属性. _i永远不会成为一个moment对象.

    _i在创建当前时刻的情况下,也可以是未定义的moment().

  • _dDate支持moment对象的对象的实例.

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

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

    如果你已经改变了时区偏移量,与utcOffset,zonetz功能,则_d不能单独.它还必须考虑是否_offset已定义.如果是,那么_d必须首先通过偏移量来调整支持对象的时间戳.您可以在此处valueOf方法实现中看到此行为.

这是当前版本的这两个字段的行为(2.10.6,因为我正在写这个).但是,还有其他字段,因为这些是内部字段,所以在将来的版本中行为可能会发生变化.特别是,请参阅问题#2616.

  • 很高兴知道 _I 是什么。我以为我遇到了问题,因为在我的应用程序中前进或后退几个月时它没有改变。 (2认同)

Rol*_*oCC 5

作为对@Matt 答案的补充:

从 chrome 的控制台查看此结果:

date1 是一个时刻的有效对象:

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