gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 21:52:30 25 4
gpt4 key购买 nike

我目前正在使用 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 一些基本的测试用例。

它可以通过扩展原型(prototype)来类似地完成,但这工作得很好。

基本上,您将 moment.js 包装在 offsetMoment 中,并为其提供一些共享变量。然后扩展 moment.fn 以便您可以轻松访问/操作共享变量。

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

它根本不影响 moment 的常规功能。 offsetMoment 对象应该与 moment 对象一起使用。

应该很容易将其调整为精确的规范。

关于javascript - 如何在 Moment.js 中设置默认偏移量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28346057/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com