moment.jsデフォルト使用サーバ時間

2070 ワード

フロントエンドでDateオブジェクトを使用して現在の時間を取得する場合、この時間はクライアントの時間です.しかし、この時間はユーザーによって変更することができるので、私たちは一般的にこの時間を望んでいません.時間を取得するたびにサーバを要求すると、サーバに不要な圧力がかかり、私たちもそうしたくない.ネットで一回りした後、いくつかの解決策を見つけて、ここでまとめてみました
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から発表します!