Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 矩JS初始化和utc()方法_Javascript_Time_Momentjs_Utc - Fatal编程技术网

Javascript 矩JS初始化和utc()方法

Javascript 矩JS初始化和utc()方法,javascript,time,momentjs,utc,Javascript,Time,Momentjs,Utc,我想了解矩JS对矩对象的初始化 例如,如果我想为日期和时间创建一个时刻: 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 } 然后,我创建了一个方便的函数,我可以用它

我想了解矩JS对矩对象的初始化

例如,如果我想为日期和时间创建一个时刻: 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
}
然后,我创建了一个方便的函数,我可以用它来创建一个有瞬间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

如果我检查上面的结果对象,我可以看到它有一个属性
\u 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)}
尽管有这个值,但如果I
console.log(result)
我得到了正确的预期日期:

2000-04-01T03:25:00+08:00
如果我现在调用utc方法。e、 g.
result.utc()
如果我再次检查对象,我可以看到现在
\u d
已更改为我最初的预期值:

_d  Date {Sat Apr 01 2000 03:25:00 GMT+0800 (HKT)}
但是,现在如果我执行
result.format()
我获得了正确的UTC日期和时间:

2000-03-31T19:25:00+00:00
我不明白这里有什么吗???? 在矩.js中如何使用_d值??? 我是否应该忽略_d值,因为它只是矩.js的内部内容

我已经为创建了JSFIDLE来说明我的观点

有几件事:

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

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

  • 如果你真的想了解更多关于
    \u d
    ,请查看

  • Date
    对象中显示的时区始终与运行代码的计算机相对。JavaScript的
    Date
    对象不能反映其他时区。当矩使用
    \u d
    时,它通常只使用由
    \u d.getTime()
    给出的瞬时值,该值仅反映UTC。(实际上,我们正在考虑在将来的版本中完全删除
    \u d
    。)

  • 确实需要调整偏移量,但应该从
    时刻.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;
    }
    
  • 您编写的函数与下面的函数非常相似。您可以将对象传递给
    时刻
    时刻.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;
    }
    
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;
}