【问题标题】:Moment time shows midnight, _i and _d properties do not match [duplicate]时刻显示午夜,_i 和 _d 属性不匹配[重复]
【发布时间】:2015-04-02 20:41:30
【问题描述】:

我在我的 Web 应用程序中使用 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代表什么,为什么和字符串输出不匹配?

【问题讨论】:

    标签: momentjs


    【解决方案1】:

    事实证明,这个错误是由我的两个错误假设共同造成的

    1. 调用startOf() 改变了那一刻,我没有意识到
    2. 我使用的不可变数据结构忽略了具有自定义原型的对象,因此对象被保留为可变的那一刻

    结果是应用程序的另一部分能够改变我认为不可变的时刻

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

    _i 是 moment 对象最初创建时的输入,并且似乎没有变化

    _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)
    

    【讨论】:

    • 既不应该使用_i,也不应该使用_d。这些是仅限内部的属性。特别是,_d 可能需要也可能不需要与其他内部属性组合以实现所需的结果。仅使用公共 API 函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-23
    • 2015-07-03
    • 1970-01-01
    • 1970-01-01
    • 2021-02-10
    • 2016-07-28
    相关资源
    最近更新 更多