首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >momentjs内部对象什么是"_d“vs "_i”

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

Stack Overflow用户
提问于 2015-01-24 22:28:42
回答 2查看 49.4K关注 0票数 73

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

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

代码语言:javascript
运行
复制
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

有没有人能开导我?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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对象具有相同的本地日期和时间。getTimevalueOf返回的时间戳也将匹配。

如果您处于"UTC模式“,那么_d将仍然具有与使用公共API的moment对象相同的UTC日期和时间。这可能会让人感到困惑,因为您需要在_d上查看getUTCDate和其他基于UTC的函数,以便查看它们是否匹配。时间戳在这里仍然是匹配的。

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

此外,如果在应用了不同的偏移量或时区时查看_d的字符串输出,就会发现_d使用的是本地时区。但是,转换为本地时间只是Date对象toString函数的副作用。Moment不会在其函数中使用该结果。

这是当前版本(我撰写本文时为2.10.6)时这两个字段的行为。但是,还有其他字段,由于这些字段是内部字段,因此行为完全有可能在未来的版本中更改。具体来说,请参阅issue #2616

票数 104
EN

Stack Overflow用户

发布于 2015-06-25 01:01:33

作为对@Matt答案的补充:

从chrome的控制台中查看以下结果:

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28126529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档