2016-02-16 46 views
1

我想了解它的那一刻对象的瞬间JS”初始化。瞬间JS初始化和UTC()方法

例如,如果我想为日期和时间创建一个时刻: 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; 
} 

当我使用这个函数来创建瞬间... 例如

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/

回答

1

有几件事情:

  • 这是在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; 
    }