如何在 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
个对象配合得很好。
应该很容易将其调整到准确的规格。
我目前正在使用 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
个对象配合得很好。
应该很容易将其调整到准确的规格。