如何在 Moment.js 中设置默认偏移量?

How to set a default offset in Moment.js?

我目前正在使用 Moment.js 来处理日期和时间。

如果用户手动更改其设备上的时间,我会尽量避免出现问题。

所以我正在获取服务器时间,检查与浏览器时间的偏移量。

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

但我不想存储该偏移量并且每次创建新时刻时都必须应用它:

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

那么有没有办法在 Moment 中设置偏移量,以便每个新时刻都应用该偏移量?类似于:

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 密切相关,但建议的答案并没有解决我的问题。

我可能会这样做:

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 以便您可以 access/manipulate 轻松共享变量。

它仅限于一个全局偏移量(但常规时刻在没有偏移量的情况下仍然有效)。

完全不影响 moment 的正常功能。 offsetMoment 个对象应该与 moment 个对象配合得很好。

应该很容易将其调整到准确的规格。