2015-04-02 141 views
3

我在我的web应用程序中使用了moment.js,并遇到一个错误,其中许多对象的时间在某个时间点更改为午夜。我仍然试图追捕什么,如果有什么触发这种变化,但看看其中一个时刻,我注意到_i属性显示了原始/正确的时间。瞬间时间显示午夜,_i和_d属性不匹配

下面是有问题的时刻之一的开发者控制台输出,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代表,为什么没有它的字符串输出相匹配?

回答

6

原来的错误是由2个坏的假设,结合我

  1. 调用startOf()变异的时刻,这是我没有意识到
  2. 不可改变的数据结构我使用的忽略造成的对象自定义原型,所以此刻的物体被留可变

结果是应用程序的另一部分是能够变异,我预计是不可变的时刻

为了虽然回答我的问题,我发现下面

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

应该使用'_i'和'_d'。这些是内部属性。特别是,'_d'可能需要或可能不需要与其他内部属性组合以实现所需的结果。仅使用公共API函数。 – 2016-07-23 21:12:37