Moment JS 初始化和 utc() 方法

Moment JS initialisation and the utc() method

想了解Moment JS对moment对象的初始化

例如,如果我想为日期和时间创建一个时刻: 2000 年 4 月 1 日,3:25:00 上午,UTC 偏移 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
}

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

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;
}

当我使用此功能创建时刻时... 例如

  var result =  moment(obj);

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

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

但实际值对我来说没有意义,因为我指定的时间是 3:25:00 并且已经是格林威治标准时间 +0800,所以不需要再增加 8 小时... .

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

几件事:

  • JavaScript 中的一个常见约定是,对象中带有下划线前缀的字段将被视为 private/internal,而不是直接使用。虽然通过闭包隐藏它们可能对用户更友好,但它也更慢,因此像 moment.js 这样的库选择让它们暴露。

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

  • 如果您真的想了解更多关于_d的信息,请查看.

  • Date 对象中显示的时区将始终 相对于代码为 运行 的计算机。 JavaScript 的 Date 对象无法反映其他时区。当 moment 使用 _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。与您的不同之处在于 moment 使用从零开始的月份,并且尚不支持传递 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;
    }