Moment JS初始化和utc()方法

时间:2016-02-16 08:34:37

标签: javascript time momentjs utc

我想了解Moment JS对其时刻对象的初始化。

例如,如果我想为日期和时间创建一个时刻: 2000年4月1日凌晨3:25:00,与UTC / GMT相差+8小时。

我在javascript对象中表示这个:

var obj = {
    year: 2000,
  month: 4, //APRIL
  day: 1,
  hour: 3,
  minute: 25,
  second: 0,
  utcOffset: 8  //8 hours from UTC
}

然后我创建了一个方便的函数,我可以用它创建一个片刻js:

var makemoment = function(obj){

  var m = moment([obj.year, obj.month - 1, obj.day, obj.hour, obj.minute, obj.second, 0]).utcOffset(obj.utcOffset);

  return m;
}

当我用这个功能来创造时刻...... e.g。

  var result =  moment(obj);

如果我检查上面的结果对象,我可以看到它有一个属性_d 我希望有一个值,如:

_d  Date {Sat Apr 01 2000 03:25:00 GMT+0800 (HKT)}

但实际值对我来说没有意义,因为我指定的时间是3:25:00,而且已经是GMT +0800,所以不需要增加8小时的时间...... / p>

_d  Date {Sat Apr 01 2000 11:25:00 GMT+0800 (HKT)}

尽管有这个_d值,但如果我console.log(result) 我得到了正确的预期日期:

2000-04-01T03:25:00+08:00

如果我暂时调用utc方法。例如result.utc() 如果我再次检查对象,我可以看到现在_d已更改为我原来预期的值:

_d  Date {Sat Apr 01 2000 03:25:00 GMT+0800 (HKT)}

然而,现在如果我做result.format() 我得到了正确的UTC日期和时间:

2000-03-31T19:25:00+00:00

我不明白这里的东西???? 如何在Moment.js中使用_d值??? 我应该忽略_d值,因为它只是Moment.js ???

内部的东西

我已经创建了JSFiddle来说明我的观点...

http://jsfiddle.net/nx2ch4ot/2/

1 个答案:

答案 0 :(得分:2)

一些事情:

  • JavaScript中的常见惯例是,以下划线为前缀的对象字段应视为私有/内部而不是直接使用。虽然通过闭包隐藏它们可能更加用户友好,但它也更慢,因此像moment.js这样的库选择让它们暴露出来。

  • 不要使用_d,而是调用公共函数,例如.format()或文档中显示的任何其他函数。

  • 如果确实希望了解_d的更多信息,请查看this answer

  • Date对象中显示的时区始终相对于运行代码的计算机。 JavaScript的Date对象无法反映其他时区。当时刻使用_d时,它主要使用它仅由_d.getTime()给出的瞬时值,它仅反映UTC。 (我们实际上正在考虑在将来的版本中完全删除_d。)

  • 您确实需要调整偏移量,但您应该从moment.utc而不是当地时间开始。更正的功能是:

    var makemoment = function(obj){
    
      var m = moment.utc([obj.year, obj.month - 1, obj.day, obj.hour, obj.minute, obj.second, 0]);
      m.subtract(obj.utcOffset, 'hours');
      m.utcOffset(obj.utcOffset);
    
      return m;
    }
    
  • 您编写的函数与already built in to moment非常相似。您可以将对象传递给momentmoment.utc。与你的不同之处在于,时刻会使用从零开始的月份,并且还不支持传递utcOffset字段。您可以考虑使用它。

    var makemoment = function(obj){
    
      obj.month--; // switch to zero-based months
      var m = moment.utc(obj);
      obj.month++; // put it back
    
      m.subtract(obj.utcOffset, 'hours');
      m.utcOffset(obj.utcOffset);
    
      return m;
    }