【问题标题】:Moment.js internal object what is "_d" vs "_i"momentjs 内部对象什么是“_d”与“_i”
【发布时间】:2015-03-23 11:21:46
【问题描述】:

我正在使用 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

有人能告诉我吗?

【问题讨论】:

    标签: momentjs


    【解决方案1】:

    不要注意那些。请改用各种输出函数,例如.format()See the Moment.js guidance on this topic。简而言之,所有前缀为下划线 (_) 的字段都应视为禁区。

    由于Date 对象的工作方式,内部结构有些奇怪。公共 API 中的所有函数都将它们考虑在内,但您可能不想自己弄清楚。

    为了完整起见,我将详细说明它们的目的:

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

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

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

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

      如果您处于“本地模式”,那么_d 将具有与使用公共 API 显示的时刻对象相同的本地日期和时间。 getTimevalueOf 返回的时间戳也会匹配。

      如果您处于“UTC 模式”,那么_d 的日期和时间仍将与公共 API 中的时刻对象具有相同的 UTC 日期和时间。这可能会令人困惑,因为您需要查看getUTCDate_d 上的其他基于UTC 的函数才能看到它们匹配。时间戳也将在这里匹配。

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

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

    这是这两个字段在当前版本(我正在写这篇文章时为 2.10.6)的行为。但是,还有其他字段,由于这些是 internal 字段,因此行为完全有可能在未来版本中发生变化。具体见issue #2616

    【讨论】:

    • 很高兴知道_I是什么。以为我遇到了问题,因为在我的应用程序中前进或后退几个月时它没有改变。
    【解决方案2】:

    作为@Matt 回答的补充:

    从 chrome 的控制台查看这个结果:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-25
      • 2016-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多