我正在使用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
有没有人能开导我?
发布于 2015-01-25 09:25:15
请不要理会这些。请改用各种输出函数,如.format()
。See the Moment.js guidance on this topic。简而言之,所有以下划线(_
)为前缀的字段都应视为禁区。
由于Date
对象的工作方式,moment内部有一些特殊之处。public API中的所有函数都考虑到了它们,但是您可能不想自己弄清楚它们。
不过,为了完整,我将详细说明它们的用途:
_i
是创建moment
对象时使用的输入。它可以是字符串、数字、数组或Date
对象。但是,如果传入另一个moment
对象,则该_i
将被复制到该moments _i
中,其他属性也将被复制。_i
永远不会是moment
对象。
在使用moment()
.创建当前时刻的情况下,也可以未定义_i
_d
是支持moment
对象的Date
对象的实例。如果您处于“本地模式”,则_d
将与使用公共接口展示的moment对象具有相同的本地日期和时间。getTime
或valueOf
返回的时间戳也将匹配。
如果您处于"UTC模式“,那么_d
将仍然具有与使用公共API的moment对象相同的UTC日期和时间。这可能会让人感到困惑,因为您需要在_d
上查看getUTCDate
和其他基于UTC的函数,以便查看它们是否匹配。时间戳在这里仍然是匹配的。
如果使用utcOffset
、zone
或tz
函数更改了时区偏移量,则_d
值不能独立。它还必须考虑是否定义了_offset
。如果是,则必须首先根据偏移量调整支持_d
对象的时间戳。您可以在valueOf
方法here的实现中看到此行为。
此外,如果在应用了不同的偏移量或时区时查看_d
的字符串输出,就会发现_d
使用的是本地时区。但是,转换为本地时间只是Date
对象toString
函数的副作用。Moment不会在其函数中使用该结果。
这是当前版本(我撰写本文时为2.10.6)时这两个字段的行为。但是,还有其他字段,由于这些字段是内部字段,因此行为完全有可能在未来的版本中更改。具体来说,请参阅issue #2616。
发布于 2015-06-25 01:01:33
作为对@Matt答案的补充:
从chrome的控制台中查看以下结果:
date1是一个时刻的有效对象:
如您所见,._d和._i具有不同的值。所以你最好在源代码中使用format()函数(就像@Matt Johnson写的那样)。
https://stackoverflow.com/questions/28126529
复制相似问题