时刻显示午夜,_i和_d属性不匹配

时间:2015-04-02 20:41:31

标签: momentjs

我在我的网络应用程序中使用了moment.js,遇到了一个错误,许多对象的时间在某个时刻变为午夜。我仍然试图追捕什么,如果有什么事情触发了这一变化,但看着其中一个时刻,我注意到_i属性显示原始/正确的时间。

以下是其中一个时刻的开发者控制台输出mm

_d: Thu Apr 02 2015 00:00:00 GMT-0400 (EDT)
_f: "YYYY-MM-DDTHH:mm:ssZ"
_i: "2015-04-02T12:10:43-04:00"
_isAMomentObject: true
_isUTC: false
_isValid: true
_locale: Locale
_pf: Object
_tzm: -240

mm.toISOString()
// "2015-04-02T04:00:00.000Z"

moment(mm._i).toISOString()
// "2015-04-02T16:10:43.000Z"

_i代表什么,为什么它不匹配字符串输出?

1 个答案:

答案 0 :(得分:6)

事实证明这个错误是由我做过的两个不好的假设组合引起的。

  1. 调用startOf()会改变那一刻,我没有意识到这一点
  2. 不可变数据结构我使用自定义原型忽略对象,所以瞬间对象变得可变
  3. 结果是该应用程序的另一部分能够改变我期望不可变的时刻

    要回答我的问题,我发现了以下内容

    _i是最初创建时刻对象时的输入,并且似乎不会更改

    _d是一个Date对象,表示任何突变后的日期值

    mm = moment("2015-04-02T12:10:43-04:00")
    mm._i // "2015-04-02T12:10:43-04:00"
    mm._d // Thu Apr 02 2015 12:10:43 GMT-0400 (EDT)
    
    mm.startOf('day')
    mm._i // "2015-04-02T12:10:43-04:00"
    mm._d // Thu Apr 02 2015 00:00:00 GMT-0400 (EDT)