Moment.js 内部对象什么是“_d”与“_i”
Moment.js internal object what is "_d" vs "_i"
我正在使用 Moment.js 并使用 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
谁能赐教一下?
不用理那些。请改用各种输出函数,例如 .format()
。 See the Moment.js guidance on this topic。简而言之,所有以下划线 (_
) 为前缀的字段都应视为禁止输入。
由于 Date
对象的工作方式,目前内部结构有些怪异。 public API 中的所有函数都考虑到了它们,但您可能不想自己弄清楚它们。
为了完整起见,我将详细说明它们的目的:
_i
是创建moment
对象时使用的输入。它可以是字符串、数字、数组或 Date
对象。
但是,如果传入另一个moment
对象,则_i
会被复制到那个时刻_i
,其他属性也会被复制过来。 _i
永远不会是 moment
对象。
_i
也可以不定义,在用moment()
.
创建当前时刻的情况下
_d
是支持 moment
对象的 Date
对象的实例。
如果您处于“本地模式”,则 _d
将具有与带有 public API 的 moment 对象相同的本地日期和时间。 getTime
或 valueOf
返回的时间戳也将匹配。
如果您处于“UTC 模式”,那么 _d
仍将具有相同的 UTC 日期和时间,因为 moment 对象显示为 public API。这可能会造成混淆,因为您需要查看 getUTCDate
和 _d
上的其他基于 UTC 的函数才能看到它们匹配。时间戳也会在这里匹配。
如果您使用 utcOffset
、zone
或 tz
函数更改了时区偏移量,则 _d
值 不能独善其身。它还必须考虑是否定义了 _offset
。如果是,则支持 _d
对象的时间戳必须首先根据偏移量进行调整。您可以在 valueOf
方法 here.
的实现中看到此行为
此外,如果您在应用了不同的偏移量或时区时查看 _d
的字符串输出,它将 出现 _d
使用 local 时区。但是,转换为本地时间只是 Date
对象的 toString
函数的副作用。 Moment 不在其函数中使用该结果。
这是这两个字段在当前版本(我写这篇文章时是 2.10.6)的行为。但是,还有其他字段,并且由于这些是 internal 字段,因此完全有可能在未来的版本中更改行为。具体请参见 issue #2616。
作为对@Matt 回答的补充:
从 chrome 的控制台检查此结果:
date1 是片刻的有效对象:
如您所见,._d 和._i 具有不同的值。因此,您最好在源代码中使用 format() 函数(如@Matt Johnson 所写)。
我正在使用 Moment.js 并使用 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
谁能赐教一下?
不用理那些。请改用各种输出函数,例如 .format()
。 See the Moment.js guidance on this topic。简而言之,所有以下划线 (_
) 为前缀的字段都应视为禁止输入。
由于 Date
对象的工作方式,目前内部结构有些怪异。 public API 中的所有函数都考虑到了它们,但您可能不想自己弄清楚它们。
为了完整起见,我将详细说明它们的目的:
_i
是创建moment
对象时使用的输入。它可以是字符串、数字、数组或Date
对象。但是,如果传入另一个
moment
对象,则_i
会被复制到那个时刻_i
,其他属性也会被复制过来。_i
永远不会是moment
对象。
创建当前时刻的情况下_i
也可以不定义,在用moment()
._d
是支持moment
对象的Date
对象的实例。如果您处于“本地模式”,则
_d
将具有与带有 public API 的 moment 对象相同的本地日期和时间。getTime
或valueOf
返回的时间戳也将匹配。如果您处于“UTC 模式”,那么
_d
仍将具有相同的 UTC 日期和时间,因为 moment 对象显示为 public API。这可能会造成混淆,因为您需要查看getUTCDate
和_d
上的其他基于 UTC 的函数才能看到它们匹配。时间戳也会在这里匹配。如果您使用
的实现中看到此行为utcOffset
、zone
或tz
函数更改了时区偏移量,则_d
值 不能独善其身。它还必须考虑是否定义了_offset
。如果是,则支持_d
对象的时间戳必须首先根据偏移量进行调整。您可以在valueOf
方法 here.此外,如果您在应用了不同的偏移量或时区时查看
_d
的字符串输出,它将 出现_d
使用 local 时区。但是,转换为本地时间只是Date
对象的toString
函数的副作用。 Moment 不在其函数中使用该结果。
这是这两个字段在当前版本(我写这篇文章时是 2.10.6)的行为。但是,还有其他字段,并且由于这些是 internal 字段,因此完全有可能在未来的版本中更改行为。具体请参见 issue #2616。
作为对@Matt 回答的补充:
从 chrome 的控制台检查此结果:
date1 是片刻的有效对象:
如您所见,._d 和._i 具有不同的值。因此,您最好在源代码中使用 format() 函数(如@Matt Johnson 所写)。