2016-02-16 47 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; 
    }