moment.jsデフォルト使用サーバ時間
2070 ワード
フロントエンドでDateオブジェクトを使用して現在の時間を取得する場合、この時間はクライアントの時間です.しかし、この時間はユーザーによって変更することができるので、私たちは一般的にこの時間を望んでいません.時間を取得するたびにサーバを要求すると、サーバに不要な圧力がかかり、私たちもそうしたくない.ネットで一回りした後、いくつかの解決策を見つけて、ここでまとめてみました
1.システムがユーザによって最初に開かれたとき、要求が送信され(専用取得時間のAPIを書く必要はない)、httpの対応するヘッダDateフィールドに基づいてサーバ時間が取得される.この時点でクライアント時間と差を付け、差を記録します.
2.クライアント時間がユーザーによって変更されないように、2 sごとにクライアント時間を取得し、前の時間と現在の時間を差にします.2 sとの差は大きくありません.通常、数十ミリ秒の差です.ここでは1 sに設定します.差が1 sより大きい場合、クライアント時間が変更されたと考えられます.このとき、前の時間と現在の時間の差を取得してから2 s減算すると、変更後の差になります.
3.moment.js内部取得時間はmoment.nowメソッドを使用しますので、このメソッドをカスタマイズしてください
コード実装は次のとおりです.
moment.nowはもともとこんな感じだった
moment.jsを導入した後、この値を再変更します.
これで大成功だ!
本文はブログの1文の多発プラットフォームOpenWriteから発表します!
1.システムがユーザによって最初に開かれたとき、要求が送信され(専用取得時間のAPIを書く必要はない)、httpの対応するヘッダDateフィールドに基づいてサーバ時間が取得される.この時点でクライアント時間と差を付け、差を記録します.
2.クライアント時間がユーザーによって変更されないように、2 sごとにクライアント時間を取得し、前の時間と現在の時間を差にします.2 sとの差は大きくありません.通常、数十ミリ秒の差です.ここでは1 sに設定します.差が1 sより大きい場合、クライアント時間が変更されたと考えられます.このとき、前の時間と現在の時間の差を取得してから2 s減算すると、変更後の差になります.
3.moment.js内部取得時間はmoment.nowメソッドを使用しますので、このメソッドをカスタマイズしてください
コード実装は次のとおりです.
var diff = 0; //
var lastTime; //
$(function(){
$.ajax({
url: apiURL,
}).always(function(res, state, xhr){
var serverTime = new Date(xhr.getResponseHeader("Date")).getTime();
var localTime = +new Date;
diff = serverTime - localTime;
lastTime = localTime;
var InvertialMillSeconds = 2000;
var maxMillSeconds = 1000;
// InvertialSeconds ,
// maxMillSeconds
setTimeout(function(){
var nowTime = +new Date;
var InverDiff = nowTime - (lastTime + InvertialMillSeconds);
if(Math.abs(InverDiff) > maxMillSeconds){
diff += InverDiff;
}
lastTime = nowTime;
setTimeout(arguments.callee, InvertialMillSeconds);
}, InvertialMillSeconds);
})
})
moment.nowはもともとこんな感じだった
var now = function() {
return Date.now ? Date.now() : +(new Date());
};
moment.jsを導入した後、この値を再変更します.
if (window.moment && window.moment.now) {
moment.now = function(){
return Date.now ? Date.now()+top.diff : (new Date().getTime() + top.diff);
}
}
これで大成功だ!
本文はブログの1文の多発プラットフォームOpenWriteから発表します!