2015-02-05 135 views
2

我目前使用Moment.js來操作日期和時間。如何在Moment.js中設置默認偏移量?

我試圖避免問題,如果用戶手動更改他的設備上的時間。

所以我得到服務器時間,檢查與瀏覽器時間的偏移量。

var offset = moment(browserTime).diff(moment(serverTime)); 

但我不想存儲偏移,並具有每個我創建一個新的時刻,隨着時間應用它:

var foo = moment().add('milliseconds', offset); 

那麼,有沒有一種方法來設置偏移那麼每一個新時刻都會有這樣的抵消?類似於:

moment.setOffset(offset); 

var foo = moment(); 
var bar = moment(new Date()).add('milliseconds', offset); 

if (foo.isSame(bar)) { 
    // success 
} 

如果不是,則將該功能添加到Moment.js(請注意我)可能是個好主意。

謝謝。

P.S .:我知道這個問題與Moment.js set the base time from the server密切相關,但提出的答案並不能解決我的問題。

+0

那麼,添加一個全局偏移?如果在您的網站上的其他地方使用時刻,並且不需要偏移,會發生什麼情況?能夠得到一個可選的配置時刻的實例(或者它的包裝)將是更好的方式來做這樣的事情,IMO;就像'var myMoment = moment.withConfig({offset:...});'。 – 2015-02-05 14:18:33

+0

如果偏移量存儲在瞬間,那麼你可以調用'''moment()。applyOffset();'''?那麼當時的其餘時間沒有問題,你不必公開偏移值globaly。 – brnrd 2015-02-05 14:28:41

回答

2

我可能會做這樣的事情:

var offsetMoment = (function(){ 
    var globalOffset = moment.duration(); // Defaults to no offset 
    var offsetMoments = []; // Stores all moments that have a global offset 
    var throwIfNotOffsetMoment = function(moment){ // Regular moment objects can't use offset methods 
     if(! moment.isOffsetMoment){ 
      throw "- Moment is not an offsetMoment."; 
     } 
    }; 

    // Sets an the globalOffset and applies it to all offsetMoments 
    // Offset is not relative to the current offset, example: 
    //  now.setGlobalOffset(1,'day') //tommorrow 
    //  now.setGlobalOffset(-1,'day') //yesterday, not today 
    // Same arguments accepted as moment.duration 
    moment.fn.setGlobalOffset = function(){ 
     var offset = moment.duration.apply(this,arguments); 
     throwIfNotOffsetMoment(this); 
     for(i in offsetMoments){ 
      offsetMoments[i].subtract(globalOffset).add(offset); // Subtract the old offset and add the new one 
     } 
     globalOffset = offset; 
     return this; 
    } 

    // Return a new moment object without the offset 
    moment.fn.baseTime = function(){ 
     throwIfNotOffsetMoment(this); 
     return this.clone().subtract(globalOffset); 
    }; 

    // Return a factory function to offsetMoment that creates offset moments 
    // Makes it work exactly like the momentjs's constructor 
    return function(){ 
     offsetMoments.push(moment.apply(this,arguments)); 
     offsetMoments[offsetMoments.length-1].isOffsetMoment = true; 
     offsetMoments[offsetMoments.length-1].add(globalOffset); 
     return offsetMoments[offsetMoments.length-1]; 
    } 
})(); 

// Usage 
var offsetA = offsetMoment("2012-10-05"); 
offsetA.setGlobalOffset(5,'minutes'); // 2012-10-05 00:05 
offsetA.baseTime(); // return new moment object = 2012-10-05 00:00 

var offsetB = offsetMoment(moment()); // five minutes from now 

JSFiddle一些基本的測試案例。

它可以通過擴展原型來做類似的工作,但是這樣做效果不錯。

基本上,您正在將moment.js包裝在offsetMoment中並給它一些共享變量。然後擴展moment.fn,以便您可以輕鬆訪問/操作共享變量。

它僅限於一個全局偏移量(但規律的時刻仍然沒有偏移量)。

它根本不影響瞬間的常規功能。和offsetMoment物體應該與moment物體打好。

應該很容易調整到確切的規格。