【问题标题】:Moment JS initialisation and the utc() methodMoment JS 初始化和 utc() 方法
【发布时间】:2016-05-27 10:23:06
【问题描述】:

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

例如,如果我想为日期和时间创建一个时刻: 2000 年 4 月 1 日凌晨 3:25:00,UTC/GMT 的 UTC 偏移量为 +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 创建一个时刻:

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 并且它已经是 GMT +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 time momentjs utc


    【解决方案1】:

    一些事情:

    • JavaScript 中的一个常见约定是,以下划线作为前缀的对象字段被视为私有/内部字段,而不是直接使用。尽管通过闭包隐藏它们可能对用户更友好,但速度也较慢,因此像 moment.js 这样的库选择让它们暴露在外。

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

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

    • 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's 使用从零开始的月份,并且还不支持传递 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;
      }
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-17
      相关资源
      最近更新 更多